ホームページ > php教程 > PHP开发 > SQL Server トリガー

SQL Server トリガー

高洛峰
リリース: 2016-12-14 16:03:29
オリジナル
1079 人が閲覧しました

トリガーは特殊なタイプのストアド プロシージャであり、前に紹介したストアド プロシージャとは異なります。トリガーは主にイベントによってトリガーされ、自動的に呼び出されて実行されます。ストアド プロシージャは、ストアド プロシージャの名前で呼び出すことができます。

Ø トリガーとは何ですか? トリガーは、テーブルの挿入、更新、または削除時に自動的に実行される特別なストアド プロシージャです。トリガーは通常、より複雑なチェック制約を持つ制約で使用されます。トリガーと通常のストアド プロシージャの違いは、トリガーが特定のテーブルに対して動作することです。更新、挿入、削除などの操作中に、システムはテーブル上の対応するトリガーを自動的に呼び出して実行します。 SQL Server 2005 のトリガーは、DML トリガーと DDL トリガーの 2 つのカテゴリに分類できます。DDL トリガーは、さまざまなデータ定義言語ステートメントに影響を与え、これらのステートメントには、create、alter、drop ステートメントがトリガーされます。

DML トリガーは次のように分類されます:

1. トリガー後 (後にトリガー)

a. トリガーの挿入

b. トリガーの削除

2. トリガーの代わりに (トリガーの前にトリガー) )

after トリガーでは、特定の操作挿入、更新、削除が実行された後にのみトリガーがトリガーされる必要があり、テーブルでのみ定義できます。トリガーの代わりに、定義された操作 (挿入、更新、削除) は実行されず、トリガー自体のみが実行されることを意味します。トリガーの代わりに、テーブルまたはビューにトリガーを定義できます。

トリガーには、挿入テーブル (挿入テーブル) と削除テーブル (削除テーブル) の 2 つの特別なテーブルがあります。これら 2 つは論理テーブルと仮想テーブルです。システムはメモリ内に 2 つのテーブルを作成しますが、それらはデータベースには保存されません。さらに、両方のテーブルは読み取り専用であり、データは読み取りのみ可能で、変更はできません。これら 2 つのテーブルの結果は、変更されたトリガーが適用されるテーブルと常に同じ構造になります。トリガーが作業を完了すると、2 つのテーブルが削除されます。挿入されたテーブルのデータは挿入または変更後のデータであり、削除されたテーブルのデータは更新または削除前のデータです。

データを更新するときは、まずテーブルのレコードを削除してから、レコードを追加します。このようにして、挿入および削除されたテーブル内のデータ レコードが更新されます。トリガー自体はトランザクションであるため、トリガー内の変更されたデータに対していくつかの特別なチェックを実行できることに注意してください。条件が満たされない場合は、トランザクション ロールバックを使用して操作を元に戻すことができます。

SQL Server トリガー

Ø トリガーの作成

構文

create trigger tgr_name
on table_name
with encrypion –加密触发器
    for update...
as
    Transact-SQL
    # 创建insert类型触发器
--创建insert插入类型触发器
if (object_id('tgr_classes_insert', 'tr') is not null)
    drop trigger tgr_classes_insert
go
create trigger tgr_classes_insert
on classes
    for insert --插入触发
as
    --定义变量
    declare @id int, @name varchar(20), @temp int;
    --在inserted表中查询已经插入记录信息
    select @id = id, @name = name from inserted;
    set @name = @name + convert(varchar, @id);
    set @temp = @id / 2;    
    insert into student values(@name, 18 + @id, @temp, @id);
    print '添加学生成功!';
go
--插入数据
insert into classes values('5班', getDate());
--查询数据
select * from classes;
select * from student order by id;
ログイン後にコピー

挿入トリガーは、新しく挿入されたレコードを挿入されたテーブルに追加します。

# 削除タイプのトリガーを作成します

--delete删除类型触发器
if (object_id('tgr_classes_delete', 'TR') is not null)
    drop trigger tgr_classes_delete
go
create trigger tgr_classes_delete
on classes
    for delete --删除触发
as
    print '备份数据中……';    
    if (object_id('classesBackup', 'U') is not null)
        --存在classesBackup,直接插入数据
        insert into classesBackup select name, createDate from deleted;
    else
        --不存在classesBackup创建再插入
        select * into classesBackup from deleted;
    print '备份数据成功!';
go
--
--不显示影响行数
--set nocount on;
delete classes where name = '5班';
--查询数据
select * from classes;
select * from classesBackup;   delete触发器会在删除数据的时候,将刚才删除的数据保存在deleted表中。
 
    # 创建update类型触发器
--update更新类型触发器
if (object_id('tgr_classes_update', 'TR') is not null)
    drop trigger tgr_classes_update
go
create trigger tgr_classes_update
on classes
    for update
as
    declare @oldName varchar(20), @newName varchar(20);
    --更新前的数据
    select @oldName = name from deleted;
    if (exists (select * from student where name like '%'+ @oldName + '%'))
        begin
            --更新后的数据
            select @newName = name from inserted;
            update student set name = replace(name, @oldName, @newName) where name like '%'+ @oldName + '%';
            print '级联修改数据成功!';
        end
    else
        print '无需修改student表!';
go
--查询数据
select * from student order by id;
select * from classes;
update classes set name = '五班' where name = '5班';     update触发器会在更新数据后,将更新前的数据保存在deleted表中,更新后的数据保存在inserted表中。
 
    # update更新列级触发器
if (object_id('tgr_classes_update_column', 'TR') is not null)
    drop trigger tgr_classes_update_column
go
create trigger tgr_classes_update_column
on classes
    for update
as
    --列级触发器:是否更新了班级创建时间
    if (update(createDate))
    begin
        raisError('系统提示:班级创建时间不能修改!', 16, 11);
        rollback tran;
    end
go
--测试
select * from student order by id;
select * from classes;
update classes set createDate = getDate() where id = 3;
update classes set name = '四班' where id = 7;
ログイン後にコピー

列レベルの更新トリガーは、列レコードを更新するかどうかを決定するために update を使用できます

# タイプのトリガーの代わりに

トリガーの代わりに、その定義が実行されないことを意味します。操作 (挿入、更新、削除) は、トリガー自体の内容のみを実行します。

文法を作成する

create trigger tgr_name
on table_name
with encryption
    instead of update...
as
    T-SQL
ログイン後にコピー
E

# トリガーの代わりを作成する

if (object_id('tgr_classes_inteadOf', 'TR') is not null)
    drop trigger tgr_classes_inteadOf
go
create trigger tgr_classes_inteadOf
on classes
    instead of delete/*, update, insert*/
as
    declare @id int, @name varchar(20);
    --查询被删除的信息,病赋值
    select @id = id, @name = name from deleted;
    print 'id: ' + convert(varchar, @id) + ', name: ' + @name;
    --先删除student的信息
    delete student where cid = @id;
    --再删除classes的信息
    delete classes where id = @id;
    print '删除[ id: ' + convert(varchar, @id) + ', name: ' + @name + ' ] 的信息成功!';
go
--test
select * from student order by id;
select * from classes;
delete classes where id = 7;
ログイン後にコピー
e

# カスタムメッセージを表示する RAISTERRORRR
if (object_id('tgr_message', 'TR') is not null)
    drop trigger tgr_message
go
create trigger tgr_message
on student
    after insert, update
as raisError('tgr_message触发器被触发', 16, 10);
go
--test
insert into student values('lily', 22, 1, 7);
update student set sex = 0 where name = 'lucy';
select * from student order by id;
ログイン後にコピー
E

# トリガーを変更する

R
alter trigger tgr_message
on student
after delete
as raisError('tgr_message触发器被触发', 16, 10);
go
--test
delete from student where name = 'lucy';
ログイン後にコピー
E

#

、トリガーを無効にする

--禁用触发器
disable trigger tgr_message on student;
--启用触发器
enable trigger tgr_message on student;
ログイン後にコピー
e

#

# 例、挿入されたデータを検証する

--查询已存在的触发器
select * from sys.triggers;
select * from sys.objects where type = 'TR';

--查看触发器触发事件
select te.* from sys.trigger_events te join sys.triggers t
on t.object_id = te.object_id
where t.parent_class = 0 and t.name = 'tgr_valid_data';

--查看创建触发器语句
exec sp_helptext 'tgr_message';
ログイン後にコピー

#例、操作ログ

if ((object_id('tgr_valid_data', 'TR') is not null))
    drop trigger tgr_valid_data
go
create trigger tgr_valid_data
on student
after insert
as
    declare @age int,
            @name varchar(20);
    select @name = s.name, @age = s.age from inserted s;
    if (@age < 18)
    begin
        raisError(&#39;插入新数据的age有问题&#39;, 16, 1);
        rollback tran;
    end
go
--test
insert into student values(&#39;forest&#39;, 2, 0, 7);
insert into student values(&#39;forest&#39;, 22, 0, 7);
select * from student order by id;
ログイン後にコピー

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート