觸發(fā)器是一種實施復雜的完整性約束的特殊存儲過程。它在
SQL Server
進行某個特定的表修改時由
SQL Server
自動執(zhí)行。觸發(fā)器一般用于加強數據庫的某些使用規(guī)則。當普通的約束(包括
CHECK
機制、
DEFAULT
機制、
RULE
機制)不足于加強數據的完整性時,就可以考慮使用觸發(fā)器。觸發(fā)器對于那些為不同的商務軟件提供后臺數據服務的大型系統特別有用。因為觸發(fā)器可以為數據庫建立獨立于具體客戶端軟件的完整性規(guī)則。
觸發(fā)器和表是緊密聯系在一起的,任何觸發(fā)器都是在特定的表上進行定義的,該表也稱為觸發(fā)器的觸發(fā)表。由于在觸發(fā)器中可以包含復雜的處理邏輯,因而在
下列情況
下應該
考慮使用觸發(fā)器
:
(1)
?????
強制比
CHECK
約束復雜的數據完整性。如需要引用其他表數據的檢查是無法通過
CHECK
約束完成的,必須使用觸發(fā)器加以實現。
(2)
?????
使用自定義的錯誤信息。通過觸發(fā)器,用戶可以捕獲破壞數據完整性的各種操作,并自由地調用預先定義的錯誤信息或動態(tài)地定制錯誤信息。約束、規(guī)則和默認值只能通過標準的系統錯誤信息傳遞錯誤信息。如果應用程序要求定制的錯誤信息和執(zhí)行更加復雜的錯誤處理,那么必須使用觸發(fā)器。
(3)
?????
實現數據庫中多張表的級聯修改。
(4)
?????
比較數據庫修改前后數據的狀態(tài)。大多數觸發(fā)器都提供了跟蹤
INSERT
、
UPDATE
或
DELETE
語句引起的數據變化的能力。因此用戶可以方便地在觸發(fā)器中找出或訪問由于修改而發(fā)生數據變化的記錄行。
(5)
?????
維護非規(guī)范數據。用戶可以使用觸發(fā)器來保證非規(guī)范數據庫環(huán)境中低級數據的完整性。
創(chuàng)建觸發(fā)器的
語法格式
如下:
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{ FOR | AFTER |INSTEAD OF } { [INSERT] [,] [UPDATE] [,] [DELETE] }
AS
?????
[{ IF UPDATE (column_name)
…
}]
?????
[{ AND | OR } UPDATE (column_name)
…
]
?????
Sql_statement [
…
n]
其中,部分
參數含義
如下:
(1)
????
trigger_name
:所建立的觸發(fā)器的名稱。觸發(fā)器的命名必須遵循
SQL Server
標示符的命名約定,并且在數據庫中必須唯一。
(2)
????
table|view:
在其上建立觸發(fā)器的基表或視圖,有時也稱為觸發(fā)器表或觸發(fā)器視圖。
(3)
????
INSERT,UPDATE
和
DELETE
:該關鍵字指定當在表或視圖上執(zhí)行哪些數據修改操作時將激活觸發(fā)器。
SQL Server
允許同一個觸發(fā)器被一種或多種操作觸發(fā)。
(4)
????
IF UPDATE
(
column_name
):指定當對基表內的某字段或某幾個字段進行插入(
INSERT
)或修改(
UPDATE
)時,觸發(fā)才起作用。
(5)
????
Sql_statement
:觸發(fā)器在被觸發(fā)之后所執(zhí)行的數據庫操作。在
SQL Server
中,一個觸發(fā)器能夠包含任意數量的
SQL
語句。
觸發(fā)器雖然在強制數據完整性方面有著十分重要的地位,但是,作為一種
特殊存儲過程
,它還有以下
幾點約束
:
(1)
????
如果在一段批處理命令中使用
CREATE TRIGGER
命令時,
CREATE TRIGGER
命令必須是批處理命令的第一條。
(2)
????
在表中如果既有約束又有觸發(fā)器,則在執(zhí)行時,約束優(yōu)先于觸發(fā)器。而且如果在操作中觸發(fā)器與約束發(fā)生沖突,觸發(fā)器將不執(zhí)行。
(3)
????
不允許在觸發(fā)器程序中出現下列語句,否則
SQL Server
將拒絕執(zhí)行:
????????????????????
i.
??????
任何數據庫對象的創(chuàng)建指令。例如:
CREATE DATABASE,CREATE TABLE
及
CREATE INDEX
等
???????????????????
ii.
??????
任何數據庫對象的刪除指令。如
DROP DATABASE,CREATE TABLE,DROP PROCEDURE
等
??????????????????
iii.
??????
所有的對象修改語句,如
ALTER TABLE
和
ALTER DATABASE.
???????????????????
iv.
??????
TRIMCATE TABLE
命令
????????????????????
v.
??????
SELECT INTO
命令
???????????????????
vi.
??????
權限命令(
GRANT
和
REVOKE
)
??????????????????
vii.
??????
UPDATE STATISTICS
語句
?????????????????
viii.
??????
SELECT INTO
(因為該語句創(chuàng)建了一個表)
???????????????????
ix.
??????
RECONFIGURE
語句
????????????????????
x.
??????
LOAD,RESTORE DATABASE
和
LOG
???????????????????
xi.
??????
所有的磁盤操作命令
(4)
????
觸發(fā)器不允許創(chuàng)建在特定的表格上,雖然在創(chuàng)建時不會提示任何的錯誤,但所創(chuàng)建的觸發(fā)器不會有任何作用。
(5)
????
TRUNCATE
命令不能觸發(fā)可以被
DELETE
操作觸發(fā)的觸發(fā)器。
Inserted
表和
deleted
表是觸發(fā)器專用的
臨時虛擬表
。在
UPDATE
類型的觸發(fā)器中,兩者均有,
INSERT
中包含
inserted
表,
DELETE
中包含
deleted
表。且他們只能由創(chuàng)建他們的觸發(fā)器引用。觸發(fā)器工作完成后,與該觸發(fā)器相關的兩個表也會被刪除。
INSERT
觸發(fā)器和
UPDATE
觸發(fā)器常用語確保用戶某些復雜的、特殊的商業(yè)規(guī)則,并保證數據在插入數據表之前是有效的。
DELETE
觸發(fā)器主要有兩個用途
:首先是防止用戶的錯誤的刪除操作;其次是在用戶刪除某個記錄時,自動實施級聯刪除,確保數據完整性。
如果在某觸發(fā)器的執(zhí)行過程中修改了另一個表,并觸發(fā)了該表的觸發(fā)器,這種情況稱為
觸發(fā)器嵌套
。使用嵌套觸發(fā)器時,應考慮下列因素:
(1)
????
在默認情況下,觸發(fā)器不允許遞歸調用。也就是說,觸發(fā)器不能自己觸發(fā)自己。
(2)
????
因為一個觸發(fā)器是一個事務,所以在嵌套觸發(fā)器中,如果任意一點失敗,那么整個事務和數據的修改將全部回滾(數據完整性的一種保護機制),如果調試的話,請在其中添加適當的打印信息。
查看觸發(fā)器信息
可以使用以下的系統存儲過程:
(1)
????
sp_depends<tablename>
:用于查看觸發(fā)器的名稱。
(2)
????
sp_helptigger<tablename>
:用于查看觸發(fā)器的類型和擁有者等初步的信息。
(3)
????
sp_helptext<triggername>
:用于查看觸發(fā)器的定義文本。
在 SQL 企業(yè)管理器中,不能直接刪除觸發(fā)器,因此, 刪除觸發(fā)器 只能使用 T-SQL 中的 DROP TRIGGER 語句 。
?
ref: http://blog.csdn.net/guilin_gavin/archive/2009/01/09/3742065.aspx ?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
