這篇文章給大家介紹SQL SERVER中各類觸發(fā)器的完整語(yǔ)法及參數(shù)是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
創(chuàng)新互聯(lián)公司是一家專業(yè)提供遵化企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為遵化眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
語(yǔ)法:
Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH[ ,...n ] ]{ FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME } ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] ::= assembly_name.class_name.method_nameTrigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE STATISTICS statement (DDL Trigger)CREATE TRIGGER trigger_name ON { ALL SERVER | DATABASE } [ WITH [ ,...n ] ]{ FOR | AFTER } { event_type | event_group } [ ,...n ]AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier > [ ; ] } ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] ::= assembly_name.class_name.method_nameTrigger on a LOGON event (Logon Trigger)CREATE TRIGGER trigger_name ON ALL SERVER [ WITH [ ,...n ] ]{ FOR| AFTER } LOGON AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier > [ ; ] } ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] ::= assembly_name.class_name.method_name
參數(shù):
schema_name
DML 觸發(fā)器所屬架構(gòu)的名稱。DML 觸發(fā)器的作用域是為其創(chuàng)建該觸發(fā)器的表或視圖的架構(gòu)。對(duì)于 DDL 或登錄觸發(fā)器,無(wú)法指定schema_name。
trigger_name
觸發(fā)器的名稱。trigger_name必須遵循 標(biāo)識(shí)符規(guī)則,但trigger_name不能以 # 或 ## 開(kāi)頭。
table|view
對(duì)其執(zhí)行 DML 觸發(fā)器的表或視圖,有時(shí)稱為觸發(fā)器表或觸發(fā)器視圖??梢愿鶕?jù)需要指定表或視圖的完全限定名稱。視圖只能被 INSTEAD OF 觸發(fā)器引用。不能對(duì)局部或全局臨時(shí)表定義 DML 觸發(fā)器。
DATABASE
將 DDL 觸發(fā)器的作用域應(yīng)用于當(dāng)前數(shù)據(jù)庫(kù)。如果指定了此參數(shù),則只要當(dāng)前數(shù)據(jù)庫(kù)中出現(xiàn)event_type或event_group,就會(huì)激發(fā)該觸發(fā)器。
ALL SERVER
將 DDL 或登錄觸發(fā)器的作用域應(yīng)用于當(dāng)前服務(wù)器。如果指定了此參數(shù),則只要當(dāng)前服務(wù)器中的任何位置上出現(xiàn)event_type或event_group,就會(huì)激發(fā)該觸發(fā)器。
WITH ENCRYPTION
對(duì) CREATE TRIGGER 語(yǔ)句的文本進(jìn)行模糊處理。使用 WITH ENCRYPTION 可以防止將觸發(fā)器作為 SQL Server 復(fù)制的一部分進(jìn)行發(fā)布。不能為 CLR 觸發(fā)器指定 WITH ENCRYPTION。
EXECUTE AS
指定用于執(zhí)行該觸發(fā)器的安全上下文。允許您控制 SQL Server 實(shí)例用于驗(yàn)證被觸發(fā)器引用的任意數(shù)據(jù)庫(kù)對(duì)象的權(quán)限的用戶帳戶。
FOR | AFTER
AFTER 指定 DML 觸發(fā)器僅在觸發(fā) SQL 語(yǔ)句中指定的所有操作都已成功執(zhí)行時(shí)才被觸發(fā)。所有的引用級(jí)聯(lián)操作和約束檢查也必須在激發(fā)此觸發(fā)器之前成功完成。
如果僅指定 FOR 關(guān)鍵字,則 AFTER 為默認(rèn)值。
不能對(duì)視圖定義 AFTER 觸發(fā)器。
INSTEAD OF
指定執(zhí)行 DML 觸發(fā)器而不是觸發(fā) SQL 語(yǔ)句,因此,其優(yōu)先級(jí)高于觸發(fā)語(yǔ)句的操作。不能為 DDL 或登錄觸發(fā)器指定 INSTEAD OF。
對(duì)于表或視圖,每個(gè) INSERT、UPDATE 或 DELETE 語(yǔ)句最多可定義一個(gè) INSTEAD OF 觸發(fā)器。但是,可以為具有自己的 INSTEAD OF 觸發(fā)器的多個(gè)視圖定義視圖。
INSTEAD OF 觸發(fā)器不可以用于使用 WITH CHECK OPTION 的可更新視圖。如果將 INSTEAD OF 觸發(fā)器添加到指定了 WITH CHECK OPTION 的可更新視圖中,則 SQL Server 將引發(fā)錯(cuò)誤。用戶須用 ALTER VIEW 刪除該選項(xiàng)后才能定義 INSTEAD OF 觸發(fā)器。
{ [DELETE] [,] [INSERT] [,] [UPDATE] }
指定數(shù)據(jù)修改語(yǔ)句,這些語(yǔ)句可在 DML 觸發(fā)器對(duì)此表或視圖進(jìn)行嘗試時(shí)激活該觸發(fā)器。必須至少指定一個(gè)選項(xiàng)。在觸發(fā)器定義中允許使用上述選項(xiàng)的任意順序組合。
對(duì)于 INSTEAD OF 觸發(fā)器,不允許對(duì)具有指定級(jí)聯(lián)操作 ON DELETE 的引用關(guān)系的表使用 DELETE 選項(xiàng)。同樣,也不允許對(duì)具有指定級(jí)聯(lián)操作 ON UPDATE 的引用關(guān)系的表使用 UPDATE 選項(xiàng)。
event_type
執(zhí)行之后將導(dǎo)致激發(fā) DDL 觸發(fā)器的 Transact-SQL 語(yǔ)言事件的名稱。DDL 事件中列出了 DDL 觸發(fā)器的有效事件。
event_group
預(yù)定義的 Transact-SQL 語(yǔ)言事件分組的名稱。執(zhí)行任何屬于event_group的 Transact-SQL 語(yǔ)言事件之后,都將激發(fā) DDL 觸發(fā)器。DDL 事件組中列出了 DDL 觸發(fā)器的有效事件組。
CREATE TRIGGER 運(yùn)行完畢之后,event_group還可通過(guò)將其涵蓋的事件類型添加到sys.trigger_events目錄視圖中來(lái)作為宏使用。
WITH APPEND
指定應(yīng)該再添加一個(gè)現(xiàn)有類型的觸發(fā)器。僅當(dāng)兼容級(jí)別等于或低于 65 時(shí),才需要使用此可選子句。如果兼容級(jí)別等于或高于 70,則不需要使用 WITH APPEND 子句來(lái)添加現(xiàn)有類型的其他觸發(fā)器。這是兼容級(jí)別設(shè)置等于或高于 70 的 CREATE TRIGGER 的默認(rèn)行為。WITH APPEND 不能與 INSTEAD OF 觸發(fā)器一起使用。如果顯式聲明了 AFTER 觸發(fā)器,則也不能使用該子句。僅當(dāng)為了向后兼容而指定了 FOR 時(shí)(但沒(méi)有 INSTEAD OF 或 AFTER)時(shí),才能使用 WITH APPEND。如果指定了 EXTERNAL NAME(即觸發(fā)器為 CLR 觸發(fā)器),則不能指定 WITH APPEND。
NOT FOR REPLICATION
指示當(dāng)復(fù)制代理修改涉及到觸發(fā)器的表時(shí),不應(yīng)執(zhí)行觸發(fā)器。有關(guān)詳細(xì)信息,請(qǐng)參閱使用 NOT FOR REPLICATION 來(lái)控制約束、標(biāo)識(shí)和觸發(fā)器。
sql_statement
觸發(fā)條件和操作。觸發(fā)器條件指定其他標(biāo)準(zhǔn),用于確定嘗試的 DML、DDL 或 logon 事件是否導(dǎo)致執(zhí)行觸發(fā)器操作。
嘗試上述操作時(shí),將執(zhí)行 Transact-SQL 語(yǔ)句中指定的觸發(fā)器操作。
觸發(fā)器可以包含任意數(shù)量和種類的 Transact-SQL 語(yǔ)句,但也有例外。觸發(fā)器的用途是根據(jù)數(shù)據(jù)修改或定義語(yǔ)句來(lái)檢查或更改數(shù)據(jù);它不應(yīng)向用戶返回?cái)?shù)據(jù)。觸發(fā)器中的 Transact-SQL 語(yǔ)句常常包含控制流語(yǔ)言。
DML 觸發(fā)器使用deleted和inserted邏輯(概念)表。它們?cè)诮Y(jié)構(gòu)上類似于定義了觸發(fā)器的表,即對(duì)其嘗試執(zhí)行了用戶操作的表。在deleted和inserted表保存了可能會(huì)被用戶更改的行的舊值或新值。例如,若要檢索deleted表中的所有值,則使用:
SELECT *FROM deleted
DDL 和登錄觸發(fā)器通過(guò)使用 EVENTDATA (Transact-SQL) 函數(shù)來(lái)獲取有關(guān)觸發(fā)事件的信息。
DELETE、INSERT 或 UPDATE 觸發(fā)器中,如果兼容級(jí)別設(shè)置為 70,則 SQL Server 不允許在inserted和deleted表中存在text、ntext或image列引用。不能訪問(wèn)inserted和deleted表中的text、ntext和image值。若要在 INSERT 或 UPDATE 觸發(fā)器中檢索新值,請(qǐng)將inserted表與原始更新表聯(lián)接。如果兼容級(jí)別等于或低于 65,則將為inserted或deleted的文本、ntext或者允許 Null 值的image列返回 Null 值;如果列不能為 Null,則返回零長(zhǎng)度的字符串。
如果兼容級(jí)別等于或高于 80,SQL Server 將允許通過(guò)表或視圖的 INSTEAD OF 觸發(fā)器來(lái)更新text、ntext或image列。
< method_specifier>
對(duì)于 CLR 觸發(fā)器,指定程序集與觸發(fā)器綁定的方法。該方法不能帶有任何參數(shù),并且必須返回空值。class_name必須是有效的 SQL Server 標(biāo)識(shí)符,并且該類必須存在于可見(jiàn)程序集中。如果該類有一個(gè)使用“.”來(lái)分隔命名空間部分的命名空間限定名稱,則類名必須用 [] 或“ ”分隔符分隔。該類不能為嵌套類。
關(guān)于SQL SERVER中各類觸發(fā)器的完整語(yǔ)法及參數(shù)是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。