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文を使用してトリガ基本文を作成するには以下の通りである.
六:トリガーの削除:基本文は次のとおりです.
七:データベースに存在するトリガーの表示:--データベースに存在するトリガーの表示
--個々のトリガーを表示
八:フリップフロップの修正:基本文は以下の通り:
9:関連例:1:Ordersテーブルにトリガを作成し、Ordersテーブルに受注レコードを挿入すると、goodsテーブルの品目ステータスstatusが1(整理中)であるかどうかを確認します.はい、Ordersテーブルに受注を追加できません.
2:Ordersテーブルに挿入トリガを作成し、注文を追加すると、Goodsテーブルの対応する品目レコードの在庫を削減します.
3:Goodsテーブルで削除トリガを確立し、GoodsテーブルとOrdersテーブルのカスケード削除を実現する.
4:Ordersテーブルに更新トリガを作成し、Ordersテーブルのオーダー日(OrderDate)列を監視し、手動で変更できないようにする.
5:Ordersテーブルに挿入トリガを作成し、Ordersテーブルに挿入された品目名がGoodsテーブルに必ず存在することを保証します.
6:Ordersテーブルは、Ordersテーブルに挿入された商品情報がOrderテーブルに追加されることを保証する挿入トリガを作成します.
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