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

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