SQL Serverトリガとその操作文


一、トリガは、明示的に呼び出されるのではなく、テーブルにレコードを挿入、更新、または削除するときに自動的にアクティブ化される特殊なストレージ・プロシージャです.したがって、トリガは、テーブルに複雑な整合性制約を実装するために使用することができる.
二、SQL Serverはトリガごとに2つの専用テーブルを作成した:InsertedテーブルとDeletedテーブル.この2つのテーブルは、データベースではなくメモリに存在するシステムによって維持されます.この2つのテーブルの構造は、トリガによって機能するテーブルの構造と常に同じです.トリガの実行が完了すると、トリガに関連する2つのテーブルも削除されます.Deletedテーブルはdelete文またはupdate文を実行するためにテーブルから削除するすべてのローを格納します.Insertedテーブルは、insert文またはupdate文を実行するためにテーブルに挿入するすべてのローを格納します.
三、Instead ofとAfterフリップフロップSQL Server 2000は二つのフリップフロップを提供する:Instead ofとAfterフリップフロップ.1.Instead ofトリガは、トリガの実行を引き起こすT-SQL文の代わりに使用されます.Instead ofトリガは、テーブルに加えて、ビューがサポートできる更新操作を拡張するためにビューにも使用できます.2.Afterフリップフロップは、insert、updateまたはdeleted文の後に実行され、Afterフリップフロップがアクティブになる前に制約チェックなどの動作が発生します.Afterトリガはテーブルにのみ使用できます.1つのテーブルまたはビューの各変更アクション(insert,update、delete)にはinstead ofトリガがあり、1つのテーブルの各変更アクションには複数のAfterトリガがあります.
四、トリガの実行プロセスinsert、updateまたはdelete文が制約に違反した場合、Afterトリガは実行されません.制約の検査はAfterトリガが興奮する前に発生したからです.したがって、Afterトリガは制約を超えてはいけません.Instead ofトリガは、その動作を励起する代わりに実行することができる.InsertedテーブルとDeletedテーブルが作成されたばかりで、他の操作がまだ発生していないときに実行されます.Instead ofトリガはコンストレイントの前に実行されるため、コンストレイントをいくつか前処理できます.
五、T-SQL文を使用してトリガ基本文を操作するのは以下の通りである.
--     
create trigger trigger_name
on {table_name | view_name}
{for | After | Instead of }
[ insert, update,delete ]
as
sql_statement

--         
create trigger trigger_test 
on table_A
after insert 
as 
insert into table_B(col_b1) select (col_a1) from inserted

--      
drop trigger trigger_name

--           
use datebase_name
go
select * from sysobjects where xtype='TR'

--        
exec sp_helptext 'trigger_name'

--      
alter trigger trigger_name
on {table_name | view_name}
{for | After | Instead of }
[ insert, update,delete ]
as
sql_statement

--          
alter trigger trigger_test
on table_A
alter insert
as
insert into table_B(col_b1) select (col_a2) from inserted

--       [PointLog]            Company    
CREATE TRIGGER TR_PointUpdate 
ON PointLog
AFTER INSERT 
AS 
    DECLARE @CompanyID INT
    SELECT @CompanyID=CompanyID from inserted
    UPDATE Company SET JF=JF+(SELECT PointChange FROM inserted) WHERE CompanyID=@CompanyID
GO

六、関連例:1:Orders表にトリガを作成し、Orders表に注文記録を挿入した場合、goods表の商品状態statusが1(整理中)であるかどうかを確認し、はい、Orders表に注文を入れることができない.
create trigger orderinsert
on orders
after insert
as 
if (select status from goods,inserted where goods.name=inserted.goodsname)=1
begin
    print 'the goods is being processed'
    print 'the order cannot be committed'
    rollback transaction   --  ﹐    
end

2:Ordersテーブルに挿入トリガを作成し、注文を追加すると、Goodsテーブルの対応する品目レコードの在庫を削減します.
create trigger orderinsert1
on orders
after insert
as
update goods set storage=storage-inserted.quantity
from goods,inserted
where
goods.name=inserted.goodsname

3:Goodsテーブルで削除トリガを確立し、GoodsテーブルとOrdersテーブルのカスケード削除を実現する.
create trigger goodsdelete
on goods
after delete
as
delete from orders 
where goodsname in
(select name from deleted)

4:Ordersテーブルに更新トリガを作成し、Ordersテーブルのオーダー日(OrderDate)列を監視し、手動で変更できないようにする.
create trigger orderdateupdate
on orders
after update
as
if update(orderdate)
begin
    raiserror(' orderdate cannot be modified',10,1)
    rollback transaction --                
end

5:Ordersテーブルに挿入トリガを作成し、Ordersテーブルに挿入された品目名がGoodsテーブルに存在することを保証します.
create trigger orderinsert3
on orders
after insert
as 
if (select count(*) from goods,inserted where goods.name=inserted.goodsname)=0
begin
    print ' no entry in goods for this order'
    rollback transaction --      
end

6:Ordersテーブルは、Ordersテーブルに挿入された商品情報がOrderテーブルに追加されることを保証する挿入トリガを作成します.
alter trigger addOrder
on Orders
for insert 
as
insert into Order
select inserted.Id, inserted.goodName,inserted.Number from inserted

エクステンションラーニングトリガブログの推奨事項:http://www.cnblogs.com/yellowapplemylove/archive/2011/04/19/2021520.html