SQL Serverトリガ-----(特殊なストレージ・プロシージャ)


1:トリガは、明示的に呼び出されるのではなく、テーブルにレコードを挿入したり、レコードを更新したり、削除したりするときに自動的にアクティブ化される特殊なストレージ・プロシージャです.したがって、トリガは、テーブルに複雑な整合性制約を実装するために使用することができる.2:SQL Serverは、各トリガに対して2つの専用テーブルを作成しました.InsertedテーブルとDeletedテーブルです.この二つの表.1:トリガは、明示的に呼び出されるのではなく、テーブルにレコードを挿入したり、レコードを更新したり、削除したりするときに自動的にアクティブ化される特殊なストレージ・プロシージャです.従って、トリガは、テーブルに対して複雑な完全性約`ビームを実装するために使用することができる.2:SQL Serverは、各トリガに対して2つの専用テーブルを作成しました.InsertedテーブルとDeletedテーブルです.この2つのテーブルは、データベースではなくメモリに存在するシステムによって維持されます.この2つのテーブルの構造は、トリガによって機能するテーブルの構造と常に同じです.トリガの実行が完了すると、トリガに関連する2つのテーブルも削除されます.Deletedテーブルは、Delete文またはUpdate文の実行によってテーブルから削除されるすべてのローを格納します.Insertedテーブルは、Insert文またはUpdate文を実行するためにテーブルに挿入するすべてのローを格納します.
 
3:Instead ofおよびAfterトリガSQL Server 2000は、2つのトリガを提供します:Instead ofおよびAfterトリガ.この2つのフリップフロップの違いは、フリップフロップの実行を引き起こすT-SQL文の代わりにInstead ofフリップフロップがアクティブ化されていることです.Instead ofトリガは、テーブルに加えて、ビューがサポートできる更新操作を拡張するためにビューにも使用できます.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 

六:トリガーの削除:基本文は次のとおりです.
drop trigger trigger_name 

七:データベースに存在するトリガーの表示:--データベースに存在するトリガーの表示
use jxcSoftware 
go 
select * from sysobjects where xtype='TR' 

--個々のトリガーを表示
exec sp_helptext '    ' 

八:フリップフロップの修正:基本文は以下の通り:
alter trigger trigger_name 
on {table_name  view_name} 
{for  After  Instead of } 
[ insert, update,delete ] 
as 
sql_statement 

9:関連例: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