数据库触发器
SQL觸發(fā)器,是一種特殊類型的存儲過程,不由用戶直接調(diào)用。它在指定的表中的數(shù)據(jù)發(fā)生變化時(shí)自動生效。喚醒調(diào)用觸發(fā)器以響應(yīng) INSERT、UPDATE 或 DELETE 語句。他可以查詢其它表,并可以包含復(fù)雜的Transact-SQL語句。將觸發(fā)器和觸發(fā)它的語句作為可在觸發(fā)器內(nèi)回滾的單個(gè)事務(wù)對待。如果檢測到嚴(yán)重錯(cuò)誤(例如,磁盤空間不足),則整個(gè)事務(wù)即自動回滾。常常用于強(qiáng)制業(yè)務(wù)規(guī)則和數(shù)據(jù)完整性。
-
DML( 數(shù)據(jù)操縱語言 Data Manipulation Language)觸發(fā)器:是指觸發(fā)器在數(shù)據(jù)庫中發(fā)生DML事件時(shí)啟用。DML事件即指在表或視圖中修改數(shù)據(jù)的insert、update、delete語句。
a、在SQL SERVER 2008中,DML觸發(fā)器的實(shí)現(xiàn)使用兩個(gè)邏輯表DELETED和INSERTED。這兩個(gè)表是建立在數(shù)據(jù)庫服務(wù)器的內(nèi)存中,我們只有只讀的權(quán)限。DELETED和INSERED表的結(jié)構(gòu)和觸發(fā)器所在的數(shù)據(jù)表的結(jié)構(gòu)是一樣的。當(dāng)觸發(fā)器執(zhí)行完成后,它們也就會被自動刪除:INSERED表用于存放你在操件insert、update、delete語句后,更新的記錄。比如你插入一條數(shù)據(jù),那么就會把這條記錄插入到INSERTED表:DELETED表用于存放你在操作 insert、update、delete語句前,你創(chuàng)建觸發(fā)器表中數(shù)據(jù)庫。
b、觸發(fā)器可通過數(shù)據(jù)庫中的相關(guān)表實(shí)現(xiàn)級聯(lián)更改,可以強(qiáng)制比用CHECK約束定義的約束更為復(fù)雜的約束。與 CHECK 約束不同,觸發(fā)器可以引用其它表中的列,例如觸發(fā)器可以使用另一個(gè)表中的 SELECT 比較插入或更新的數(shù)據(jù),以及執(zhí)行其它操作。觸發(fā)器也可以根據(jù)數(shù)據(jù)修改前后的表狀態(tài),再行采取對策。一個(gè)表中的多個(gè)同類觸發(fā)器(INSERT、UPDATE 或 DELETE)允許采取多個(gè)不同的對策以響應(yīng)同一個(gè)修改語句。
c、與此同時(shí),雖然觸發(fā)器功能強(qiáng)大,輕松可靠地實(shí)現(xiàn)許多復(fù)雜的功能,為什么又要慎用?過多觸發(fā)器會造成數(shù)據(jù)庫及應(yīng)用程序的維護(hù)困難,同時(shí)對觸發(fā)器過分的依賴,勢必影響數(shù)據(jù)庫的結(jié)構(gòu),同時(shí)增加了維護(hù)的復(fù)雜程序。
-
DDL(數(shù)據(jù)定義語言 Data Definition Language)觸發(fā)器:是指當(dāng)服務(wù)器或數(shù)據(jù)庫中發(fā)生(DDL事件時(shí)啟用。DDL事件即指在表或索引中的create、alter、drop語句也。
-
登陸觸發(fā)器:是指當(dāng)用戶登錄SQL SERVER實(shí)例建立會話時(shí)觸發(fā)。
2優(yōu)點(diǎn)
編輯觸發(fā)器可通過數(shù)據(jù)庫中的相關(guān)表實(shí)現(xiàn)級聯(lián)更改;通過級聯(lián)引用完整性約束可以更有效地執(zhí)行這些更改。
觸發(fā)器可以強(qiáng)制比用 CHECK 約束定義的約束更為復(fù)雜的約束。
與 CHECK 約束不同,觸發(fā)器可以引用其它表中的列。例如,觸發(fā)器可以使用另一個(gè)表中的 SELECT 比較插入或更新的數(shù)據(jù),以及執(zhí)行其它操作,如修改數(shù)據(jù)或顯示用戶定義錯(cuò)誤信息。
觸發(fā)器也可以評估數(shù)據(jù)修改前后的表狀態(tài),并根據(jù)其差異采取對策。
比較觸發(fā)器與約束
約束和觸發(fā)器在特殊情況下各有優(yōu)勢。觸發(fā)器的主要好處在于它們可以包含使用?Transact-SQL?代碼的復(fù)雜處理邏輯。因此,觸發(fā)器可以支持約束的所有功能;但它在所給出的功能上并不總是最好的方法。
實(shí)體完整性總應(yīng)在最低級別上通過索引進(jìn)行強(qiáng)制,這些索引或是 PRIMARY KEY 和 UNIQUE 約束的一部分,或是在約束之外獨(dú)立創(chuàng)建的。假設(shè)功能可以滿足應(yīng)用程序的功能需求,域完整性應(yīng)通過 CHECK 約束進(jìn)行強(qiáng)制,而引用完整性 (RI) 則應(yīng)通過 FOREIGN KEY 約束進(jìn)行強(qiáng)制。
在約束所支持的功能無法滿足應(yīng)用程序的功能要求時(shí),觸發(fā)器就極為有用。例如:
除非 REFERENCES 子句定義了級聯(lián)引用操作,否則 FOREIGN KEY 約束只能以與另一列中的值完全匹配的值來驗(yàn)證列值。
CHECK 約束只能根據(jù)邏輯表達(dá)式或同一表中的另一列來驗(yàn)證列值。如果應(yīng)用程序要求根據(jù)另一個(gè)表中的列驗(yàn)證列值,則必須使用觸發(fā)器。
約束只能通過標(biāo)準(zhǔn)的系統(tǒng)錯(cuò)誤信息傳遞錯(cuò)誤信息。如果應(yīng)用程序要求使用(或能從中獲益)自定義信息和較為復(fù)雜的錯(cuò)誤處理,則必須使用觸發(fā)器。
觸發(fā)器可通過數(shù)據(jù)庫中的相關(guān)表實(shí)現(xiàn)級聯(lián)更改;不過,通過級聯(lián)引用完整性約束可以更有效地執(zhí)行這些更改。
觸發(fā)器可以禁止或回滾違反引用完整性的更改,從而取消所嘗試的數(shù)據(jù)修改。當(dāng)更改外鍵且新值與主鍵不匹配時(shí),此類觸發(fā)器就可能發(fā)生作用。例如,可以在 titleauthor.title_id 上創(chuàng)建一個(gè)插入觸發(fā)器,使它在新值與 titles.title_id 中的某個(gè)值不匹配時(shí)回滾一個(gè)插入。不過,通常使用 FOREIGN KEY 來達(dá)到這個(gè)目的。
如果觸發(fā)器表上存在約束,則在 INSTEAD OF觸發(fā)器執(zhí)行后但在 AFTER觸發(fā)器執(zhí)行前檢查這些約束。如果約束破壞,則回滾INSTEAD OF觸發(fā)器操作并且不執(zhí)行 AFTER觸發(fā)器。
語法
編輯CREATE TRIGGER trigger_name
ON { table|view }
[ WITH ENCRYPTION ]
{
{ { FOR|AFTER|INSTEAD OF } { [ INSERT ] [ DELETE ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND|OR } UPDATE ( column ) ]
[ ...n ]
|IF ( COLUMNS_UPDATED ( ) updated_bitmask )
column_bitmask [ ...n ]
} ]
sql_statement [ ...n ]
}
}
參數(shù)
trigger_name
是觸發(fā)器的名稱。觸發(fā)器名稱必須符合標(biāo)識符規(guī)則,并且在數(shù)據(jù)庫中必須唯一??梢赃x擇是否指定觸發(fā)器所有者名稱。
Table|view
是在其上執(zhí)行觸發(fā)器的表或視圖,有時(shí)稱為觸發(fā)器表或觸發(fā)器視圖。可以選擇是否指定表或視圖的所有者名稱。
WITH ENCRYPTION
加密 syscomments 表中包含 CREATE TRIGGER 語句文本的條目。使用 WITH ENCRYPTION 可防止觸發(fā)器作為 SQL Server 復(fù)制的一部分發(fā)布。
AFTER
指定觸發(fā)器只有在觸發(fā) SQL 語句中指定的所有操作都已成功執(zhí)行后才激發(fā)。所有的引用級聯(lián)操作和約束檢查也必須成功完成后,才能執(zhí)行此觸發(fā)器。
如果僅指定 FOR 關(guān)鍵字,則 AFTER 是默認(rèn)設(shè)置。
不能在視圖上定義 AFTER 觸發(fā)器。
INSTEAD OF
指定執(zhí)行觸發(fā)器而不是執(zhí)行觸發(fā) SQL 語句,從而替代觸發(fā)語句的操作。
在表或視圖上,每個(gè) INSERT、UPDATE 或 DELETE 語句最多可以定義一個(gè) INSTEAD OF 觸發(fā)器。然而,可以在每個(gè)具有 INSTEAD OF觸發(fā)器的視圖上定義視圖。
INSTEAD OF觸發(fā)器不能在 WITH CHECK OPTION 的可更新視圖上定義。如果向指定了 WITH CHECK OPTION 選項(xiàng)的可更新視圖添加 INSTEAD OF觸發(fā)器,SQL Server產(chǎn)生一個(gè)錯(cuò)誤。用戶必須用 ALTER VIEW 刪除該選項(xiàng)后才能定義 INSTEAD OF 觸發(fā)器。
{ [DELETE] [,] [INSERT] [,] [UPDATE] }
是指定在表或視圖上執(zhí)行哪些數(shù)據(jù)修改語句時(shí)激活觸發(fā)器的關(guān)鍵字。必須至少指定一個(gè)選項(xiàng)。在觸發(fā)器定義中允許使用以任意順序組合的這些關(guān)鍵字。如果指定的選項(xiàng)多于一個(gè),需用逗號分隔這些選項(xiàng)。
對于 INSTEAD OF觸發(fā)器,不允許在具有 ON DELETE 級聯(lián)操作引用關(guān)系的表上使用 DELETE 選項(xiàng)。同樣,也不允許在具有 ON UPDATE 級聯(lián)操作引用關(guān)系的表上使用 UPDATE 選項(xiàng)。
WITH APPEND
指定應(yīng)該添加現(xiàn)有類型的其它觸發(fā)器。只有當(dāng)兼容級別是 65 或更低時(shí),才需要使用該可選子句。如果兼容級別是 70 或更高,則不必使用 WITH APPEND 子句添加現(xiàn)有類型的其它觸發(fā)器(這是兼容級別設(shè)置為 70 或更高的 CREATE TRIGGER 的默認(rèn)行為)。有關(guān)更多信息,請參見 sp_dbcmptlevel。
WITH APPEND 不能與 INSTEAD OF觸發(fā)器一起使用,或者,如果顯式聲明 AFTER 觸發(fā)器,也不能使用該子句。只有當(dāng)出于向后兼容而指定 FOR 時(shí)(沒有 INSTEAD OF 或 AFTER),才能使用 WITH APPEND。以后的版本不支持 WITH APPEND 和 FOR(被解釋為 AFTER)。
NOT FOR REPLICATION
表示當(dāng)復(fù)制進(jìn)程更改觸發(fā)器所涉及的表時(shí),不應(yīng)執(zhí)行該觸發(fā)器。
AS
是觸發(fā)器要執(zhí)行的操作。
sql_statement
是觸發(fā)器的條件和操作。觸發(fā)器條件指定其它準(zhǔn)則,以確定 DELETE、INSERT 或 UPDATE 語句是否導(dǎo)致執(zhí)行觸發(fā)器操作。
當(dāng)嘗試 DELETE、INSERT 或 UPDATE 操作時(shí),Transact-SQL語句中指定的觸發(fā)器操作生效。
觸發(fā)器可以包含任意數(shù)量和種類的 Transact-SQL 語句。觸發(fā)器旨在根據(jù)數(shù)據(jù)修改語句檢查或更改數(shù)據(jù);它不應(yīng)數(shù)據(jù)返回給用戶。觸發(fā)器中的 Transact-SQL 語句常常包含控制流語言。CREATE TRIGGER 語句中使用幾個(gè)特殊的表:
* deleted 和 inserted 是邏輯(概念)表。這些表在結(jié)構(gòu)上類似于定義觸發(fā)器的表(也就是在其中嘗試用戶操作的表);這些表用于保存用戶操作可能更改的行的舊值或新值。例如,若要檢索 deleted 表中的所有值,請使用:
SELECT *
FROM deleted
* 如果兼容級別等于 70,那么在 DELETE、INSERT 或 UPDATE觸發(fā)器中,SQL Server不允許引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能訪問 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE觸發(fā)器中檢索新值,請inserted 表與原始更新表聯(lián)接。當(dāng)兼容級別是 65 或更低時(shí),對 inserted 或 deleted 表中允許空值的text、ntext 或 image 列,返回空值;如果這些列不可為空,則返回零長度字符串。
當(dāng)兼容級別是 80 或更高時(shí),SQL Server 允許在表或視圖上通過 INSTEAD OF觸發(fā)器更新 text、ntext 或 image 列。
n
是表示觸發(fā)器中可以包含多條 Transact-SQL 語句的占位符。對于 IF UPDATE (column) 語句,可以通過重復(fù) UPDATE (column) 子句包含多列。
IF UPDATE (column)
測試在指定的列上進(jìn)行的 INSERT 或 UPDATE 操作,不能用于 DELETE 操作??梢灾付ǘ嗔小R?yàn)樵?ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要測試在多個(gè)列上進(jìn)行的 INSERT 或 UPDATE 操作,請?jiān)诘谝粋€(gè)操作后指定單獨(dú)的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE返回 TRUE 值,因?yàn)檫@些列插入了顯式值或隱性 (NULL) 值。
說明 IF UPDATE (column) 子句的功能等同于 IF、IF...ELSE 或 WHILE 語句,并且可以使用 BEGIN...END 語句塊。有關(guān)更多信息,請參見控制流語言。
可以在觸發(fā)器主體中的任意位置使用 UPDATE (column)。
column
是要測試 INSERT 或 UPDATE 操作的列名。該列可以是 SQL Server 支持的任何數(shù)據(jù)類型。但是,計(jì)算列不能用于該環(huán)境中。有關(guān)更多信息,請參見數(shù)據(jù)類型。
IF (COLUMNS_UPDATED())
測試是否插入或更新了提及的列,僅用于 INSERT 或 UPDATE觸發(fā)器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。
COLUMNS_UPDATED 函數(shù)以從左到右的順序返回位,最左邊的為最不重要的位。最左邊的位表示表中的第一列;向右的下一位表示第二列,依此類推。如果在表上創(chuàng)建的觸發(fā)器包含 8 列以上,則 COLUMNS_UPDATED 返回多個(gè)字節(jié),最左邊的為最不重要的字節(jié)。在 INSERT 操作中 COLUMNS_UPDATED對所有列返回 。
可以在觸發(fā)器主體中的任意位置使用 COLUMNS_UPDATED。
bitwise_operator
是用于比較運(yùn)算的位運(yùn)算符。
updated_bitmask
是整型位掩碼,表示實(shí)際更新或插入的列。例如,表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE觸發(fā)器,若要檢查列 C2、C3 和 C4 是否都有更新,指定值 14;若要檢查是否只有列 C2 有更新,指定值 2。
comparison_operator
是比較運(yùn)算符。使用等號 (=) 檢查 updated_bitmask 中指定的所有列是否都實(shí)際進(jìn)行了更新。使用大于號?(>) 檢查 updated_bitmask 中指定的任一列或某些列是否已更新。
column_bitmask
是要檢查的列的整型位掩碼,用來檢查是否已更新或插入了這些列。
注釋
觸發(fā)器常常用于強(qiáng)制業(yè)務(wù)規(guī)則和數(shù)據(jù)完整性。SQL Server 通過表創(chuàng)建語句(ALTER TABLE 和 CREATE TABLE)提供聲明引用完整性(DRI);但是 DRI 不提供數(shù)據(jù)庫間的引用完整性。若要強(qiáng)制引用完整性(有關(guān)表的主鍵和外鍵之間關(guān)系的規(guī)則),請使用主鍵和外鍵約束(ALTER TABLE 和 CREATE TABLE 的 PRIMARY KEY 和 FOREIGN KEY關(guān)鍵字)。如果觸發(fā)器表存在約束,則在 INSTEAD OF觸發(fā)器執(zhí)行之后和 AFTER觸發(fā)器執(zhí)行之前檢查這些約束。如果違反了約束,則回滾INSTEAD OF觸發(fā)器操作且不執(zhí)行(激發(fā))AFTER觸發(fā)器。
可用 sp_settriggerorder 指定表上第一個(gè)和最后一個(gè)執(zhí)行的 AFTER觸發(fā)器。在表上只能為每個(gè) INSERT、UPDATE 和 DELETE 操作指定一個(gè)第一個(gè)執(zhí)行和一個(gè)最后一個(gè)執(zhí)行的 AFTER觸發(fā)器。如果同一表上還有其它 AFTER觸發(fā)器,則這些觸發(fā)器以隨機(jī)順序執(zhí)行。
如果 ALTER TRIGGER 語句更改了第一個(gè)或最后一個(gè)觸發(fā)器,則除去已修改觸發(fā)器上設(shè)置的第一個(gè)或最后一個(gè)特性,而且必須用 sp_settriggerorder 重置排序值。
只有當(dāng)觸發(fā) SQL 語句(包括所有與更新或刪除的對象關(guān)聯(lián)的引用級聯(lián)操作和約束檢查)成功執(zhí)行后,AFTER觸發(fā)器才會執(zhí)行。AFTER觸發(fā)器檢查觸發(fā)語句的運(yùn)行效果,以及所有由觸發(fā)語句引起的 UPDATE 和 DELETE 引用級聯(lián)操作的效果。
觸發(fā)器限制
CREATE TRIGGER 必須是批處理中的第一條語句,并且只能應(yīng)用到一個(gè)表中。
觸發(fā)器只能在當(dāng)前的數(shù)據(jù)庫中創(chuàng)建,不過觸發(fā)器可以引用當(dāng)前數(shù)據(jù)庫的外部對象。
如果指定觸發(fā)器所有者名稱以限定觸發(fā)器,請以相同的方式限定表名。
在同一條 CREATE TRIGGER 語句中,可以為多種用戶操作(如 INSERT 和 UPDATE)定義相同的觸發(fā)器操作。
如果一個(gè)表的外鍵在 DELETE/UPDATE 操作上定義了級聯(lián),則不能在該表上定義 INSTEAD OF DELETE/UPDATE 觸發(fā)器。
在觸發(fā)器內(nèi)可以指定任意的 SET 語句。所選擇的 SET 選項(xiàng)在觸發(fā)器執(zhí)行期間有效,并在觸發(fā)器執(zhí)行完后恢復(fù)到以前的設(shè)置。
與使用存儲過程一樣,當(dāng)觸發(fā)器激發(fā)時(shí),向調(diào)用應(yīng)用程序返回結(jié)果。若要避免由于觸發(fā)器激發(fā)而向應(yīng)用程序返回結(jié)果,請不要包含返回結(jié)果的 SELECT 語句,也不要包含在觸發(fā)器中進(jìn)行變量賦值的語句。包含向用戶返回結(jié)果的 SELECT 語句或進(jìn)行變量賦值的語句的觸發(fā)器需要特殊處理;這些返回的結(jié)果必須寫入允許修改觸發(fā)器表的每個(gè)應(yīng)用程序中。如果必須在觸發(fā)器中進(jìn)行變量賦值,則應(yīng)該在觸發(fā)器的開頭使用 SET NOCOUNT 語句以避免返回任何結(jié)果集。
DELETE觸發(fā)器不能捕獲 TRUNCATE TABLE 語句。盡管 TRUNCATE TABLE 語句實(shí)際上是沒有 WHERE 子句的 DELETE(它刪除所有行),但它是無日志記錄的,因而不能執(zhí)行觸發(fā)器。因?yàn)?TRUNCATE TABLE 語句的權(quán)限默認(rèn)授予表所有者且不可轉(zhuǎn)讓,所以只有表所有者才需要考慮無意中用 TRUNCATE TABLE 語句規(guī)避 DELETE觸發(fā)器的問題。
無論有日志記錄還是無日志記錄,WRITETEXT 語句都不激活觸發(fā)器。
觸發(fā)器中不允許以下 Transact-SQL 語句:
ALTER DATABASE CREATE DATABASE DISK INIT
DISK RESIZE DROP DATABASE LOAD DATABASE
LOAD LOG RECONFIGURE RESTORE DATABASE
RESTORE LOG
說明 由于 SQL Server 不支持系統(tǒng)表中的用戶定義觸發(fā)器,因此建議不要在系統(tǒng)表中創(chuàng)建用戶定義觸發(fā)器。
多個(gè)觸發(fā)器
SQL Server 允許為每個(gè)數(shù)據(jù)修改事件(DELETE、INSERT 或 UPDATE)創(chuàng)建多個(gè)觸發(fā)器。例如,如果對已有 UPDATE觸發(fā)器的表執(zhí)行 CREATE TRIGGER FOR UPDATE,則創(chuàng)建另一個(gè)更新觸發(fā)器。在早期版本中,在每個(gè)表上,每個(gè)數(shù)據(jù)修改事件(INSERT、UPDATE 或 DELETE)只允許有一個(gè)觸發(fā)器。
說明 如果觸發(fā)器名稱不同,則 CREATE TRIGGER(兼容級別為 70)的默認(rèn)行為是在現(xiàn)有的觸發(fā)器中添加其它觸發(fā)器。如果觸發(fā)器名稱相同,則 SQL Server 返回一條錯(cuò)誤信息。但是,如果兼容級別等于或小于 65,則使用 CREATE TRIGGER 語句創(chuàng)建的新觸發(fā)器替換同一類型的任何現(xiàn)有觸發(fā)器,即使觸發(fā)器名稱不同。有關(guān)更多信息,請參見 sp_dbcmptlevel。
遞歸觸發(fā)器
當(dāng)在 sp_dboption 中啟用 recursive triggers 設(shè)置時(shí),SQL Server 還允許觸發(fā)器的遞歸調(diào)用。
遞歸觸發(fā)器允許發(fā)生兩種類型的遞歸:
* 間接遞歸
* 直接遞歸
使用間接遞歸時(shí),應(yīng)用程序更新表 T1,從而激發(fā)觸發(fā)器TR1,該觸發(fā)器更新表 T2。在這種情況下,觸發(fā)器T2激發(fā)并更新 T1。
使用直接遞歸時(shí),應(yīng)用程序更新表 T1,從而激發(fā)觸發(fā)器TR1,該觸發(fā)器更新表 T1。由于表 T1 被更新,觸發(fā)器TR1 再次激發(fā),依此類推。
下例既使用了間接觸發(fā)器遞歸,又使用了直接觸發(fā)器遞歸。假定在表 T1 中定義了兩個(gè)更新觸發(fā)器TR1 和 TR2。觸發(fā)器 TR1 遞歸地更新表 T1。UPDATE 語句使 TR1 和 TR2 各執(zhí)行一次。而 TR1 的執(zhí)行觸發(fā) TR1(遞歸)和 TR2 的執(zhí)行。給定觸發(fā)器的 inserted 和 deleted 表只包含與喚醒調(diào)用觸發(fā)器的 UPDATE 語句相對應(yīng)的行。
說明 只有啟用 sp_dboption 的 recursive triggers 設(shè)置,才會發(fā)生上述行為。對于為給定事件定義的多個(gè)觸發(fā)器,并沒有確定的執(zhí)行順序。每個(gè)觸發(fā)器都應(yīng)是自包含的。
禁用 recursive triggers 設(shè)置只能禁止直接遞歸。若要也禁用間接遞歸,請使用 sp_configurenested triggers 服務(wù)器選項(xiàng)設(shè)置為 0。
如果任一觸發(fā)器執(zhí)行了 ROLLBACK TRANSACTION 語句,則無論嵌套級是多少,都不會進(jìn)一步執(zhí)行其它觸發(fā)器。
嵌套觸發(fā)器
觸發(fā)器最多可以嵌套 32 層。如果一個(gè)觸發(fā)器更改了包含另一個(gè)觸發(fā)器的表,則第二個(gè)觸發(fā)器激活,然后該觸發(fā)器可以再調(diào)用第三個(gè)觸發(fā)器,依此類推。如果鏈中任意一個(gè)觸發(fā)器引發(fā)了無限循環(huán),則會超出嵌套級限制,從而導(dǎo)致取消觸發(fā)器。若要禁用嵌套觸發(fā)器,請用 sp_configurenested triggers 選項(xiàng)設(shè)置為 0(關(guān)閉)。默認(rèn)配置允許嵌套觸發(fā)器。如果嵌套觸發(fā)器是關(guān)閉的,則也禁用遞歸觸發(fā)器,與 sp_dboption 的 recursive triggers 設(shè)置無關(guān)。
延遲名稱解析
SQL Server 允許 Transact-SQL存儲過程、觸發(fā)器和批處理引用編譯時(shí)不存在的表。這種能力稱為延遲名稱解析。但是,如果 Transact-SQL存儲過程、觸發(fā)器或批處理引用在存儲過程或觸發(fā)器中定義的表,則只有當(dāng)兼容級別設(shè)置(通過執(zhí)行 sp_dbcmptlevel 設(shè)置)等于 65 時(shí),才會在創(chuàng)建時(shí)發(fā)出警告。如果使用批處理,則在編譯時(shí)發(fā)出警告。如果引用的表不存在,在運(yùn)行時(shí)返回錯(cuò)誤信息。有關(guān)更多信息,請參見延遲名稱解析和編譯。
權(quán)限
CREATE TRIGGER 權(quán)限默認(rèn)授予定義觸發(fā)器的表所有者、sysadmin 固定服務(wù)器角色成員以及 db_owner 和 db_ddladmin固定數(shù)據(jù)庫角色成員,并且不可轉(zhuǎn)讓。
若要檢索表或視圖中的數(shù)據(jù),用戶必須在表或視圖中擁有 SELECT 語句權(quán)限。若要更新表或視圖的內(nèi)容,用戶必須在表或視圖中擁有 INSERT、DELETE 和 UPDATE 語句權(quán)限。
如果視圖中存在 INSTEAD OF觸發(fā)器,用戶必須在該視圖中有 INSERT、DELETE 和 UPDATE 特權(quán),以對該視圖發(fā)出 INSERT、DELETE 和 UPDATE 語句,而不管實(shí)際上是否在視圖上執(zhí)行了這樣的操作。
轉(zhuǎn)載于:https://www.cnblogs.com/qwer123666/p/7083277.html
總結(jié)
- 上一篇: Scrapy 安装
- 下一篇: SQL查询重复记录方法大全 转