SQL觸發(fā)器語法參考_第1頁
SQL觸發(fā)器語法參考_第2頁
SQL觸發(fā)器語法參考_第3頁
SQL觸發(fā)器語法參考_第4頁
SQL觸發(fā)器語法參考_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、SQL觸發(fā)器語法參考 語法CREATE TRIGGER trigger_name ON  table | view   WITH ENCRYPTION        FOR | AFTER | INSTEAD OF    INSERT   ,   UPDATE

2、           WITH APPEND          NOT FOR REPLICATION         AS          IF UPDAT

3、E ( column )              AND | OR  UPDATE ( column )                  n   

4、      | IF ( COLUMNS_UPDATED ( )  bitwise_operator  updated_bitmask )                 comparison_operator  column_bitmask

5、0; n                   sql_statement  n        參數(shù)trigger_name是觸發(fā)器的名稱。觸發(fā)器名稱必須符合標(biāo)識(shí)符規(guī)則,并且在數(shù)據(jù)庫中必須唯一??梢赃x擇是否指定觸發(fā)器所有者名稱。Table | view是在其上執(zhí)行觸發(fā)器的表或視圖,有時(shí)稱為觸發(fā)器表或觸

6、發(fā)器視圖??梢赃x擇是否指定表或視圖的所有者名稱。WITH ENCRYPTION加密 syscomments 表中包含 CREATE TRIGGER 語句文本的條目。使用 WITH ENCRYPTION 可防止將觸發(fā)器作為 SQL Server 復(fù)制的一部分發(fā)布。AFTER指定觸發(fā)器只有在觸發(fā) SQL 語句中指定的所有操作都已成功執(zhí)行后才激發(fā)。所有的引用級(jí)聯(lián)操作和約束檢查也必須成功完成后,才能執(zhí)行此觸發(fā)器。如果僅指定 FOR 關(guān)鍵字,則 AFTER 是默認(rèn)設(shè)置。不能在視圖上定義 AFTER 觸發(fā)器。INSTEAD OF指定執(zhí)行觸發(fā)器而不是執(zhí)行觸發(fā) SQL 語句,從而替代觸發(fā)語句的操作。在表或視圖

7、上,每個(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ā)器的

8、關(guān)鍵字。必須至少指定一個(gè)選項(xiàng)。在觸發(fā)器定義中允許使用以任意順序組合的這些關(guān)鍵字。如果指定的選項(xiàng)多于一個(gè),需用逗號(hào)分隔這些選項(xiàng)。對(duì)于 INSTEAD OF 觸發(fā)器,不允許在具有 ON DELETE 級(jí)聯(lián)操作引用關(guān)系的表上使用 DELETE 選項(xiàng)。同樣,也不允許在具有 ON UPDATE 級(jí)聯(lián)操作引用關(guān)系的表上使用 UPDATE 選項(xiàng)。WITH APPEND指定應(yīng)該添加現(xiàn)有類型的其它觸發(fā)器。只有當(dāng)兼容級(jí)別是 65 或更低時(shí),才需要使用該可選子句。如果兼容級(jí)別是 70 或更高,則不必使用 WITH APPEND 子句添加現(xiàn)有類型的其它觸發(fā)器(這是兼容級(jí)別設(shè)置為 70 或更高的 CREATE TRIG

9、GER 的默認(rèn)行為)。有關(guān)更多信息,請(qǐng)參見 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)則,以確定

10、 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ā)器的表(也就是在其中嘗試用戶操作的表);這些表用于保存用戶操作

11、可能更改的行的舊值或新值。例如,若要檢索 deleted 表中的所有值,請(qǐng)使用: · SELECT *· FROM deleted · 如果兼容級(jí)別等于 70,那么在 DELETE、INSERT 或 UPDATE 觸發(fā)器中,SQL Server 將不允許引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能訪問 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 觸發(fā)器中檢索新值,請(qǐng)將 inserted 表與原始更新表聯(lián)接。當(dāng)兼容級(jí)別是 65 或

12、更低時(shí),對(duì) inserted 或 deleted 表中允許空值的text、ntext 或 image 列,將返回空值;如果這些列不可為空,則返回零長(zhǎng)度字符串。 當(dāng)兼容級(jí)別是 80 或更高時(shí),SQL Server 允許在表或視圖上通過 INSTEAD OF 觸發(fā)器更新 text、ntext 或 image 列。n是表示觸發(fā)器中可以包含多條 Transact-SQL 語句的占位符。對(duì)于 IF UPDATE (column) 語句,可以通過重復(fù) UPDATE (column) 子句包含多列。IF UPDATE (column)測(cè)試在指定的列上進(jìn)行的 INSERT 或 UPDATE 操作,不能用于 D

13、ELETE 操作。可以指定多列。因?yàn)樵?ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要測(cè)試在多個(gè)列上進(jìn)行的 INSERT 或 UPDATE 操作,請(qǐng)?jiān)诘谝粋€(gè)操作后指定單獨(dú)的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 將返回 TRUE 值,因?yàn)檫@些列插入了顯式值或隱性 (NULL) 值。說明  IF UPDATE (column) 子句的功能等同于 IF、IF.ELSE 或 WHILE 語句,并且可以使用 BEGIN.END 語句塊。有關(guān)更多信息,請(qǐng)參見控制流語言。  可以在觸發(fā)器主體中的

14、任意位置使用 UPDATE (column)。column是要測(cè)試 INSERT 或 UPDATE 操作的列名。該列可以是 SQL Server 支持的任何數(shù)據(jù)類型。但是,計(jì)算列不能用于該環(huán)境中。有關(guān)更多信息,請(qǐng)參見數(shù)據(jù)類型。 IF (COLUMNS_UPDATED() 測(cè)試是否插入或更新了提及的列,僅用于 INSERT 或 UPDATE 觸發(fā)器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。COLUMNS_UPDATED 函數(shù)以從左到右的順序返回位,最左邊的為最不重要的位。最左邊的位表示表中的第一列;向右的下一位表示第二列,依此類推。如果在

15、表上創(chuàng)建的觸發(fā)器包含 8 列以上,則 COLUMNS_UPDATED 返回多個(gè)字節(jié),最左邊的為最不重要的字節(jié)。在 INSERT 操作中 COLUMNS_UPDATED 將對(duì)所有列返回 TRUE 值,因?yàn)檫@些列插入了顯式值或隱性 (NULL) 值??梢栽谟|發(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;

16、若要檢查是否只有列 C2 有更新,指定值 2。comparison_operator是比較運(yùn)算符。使用等號(hào) (=) 檢查 updated_bitmask 中指定的所有列是否都實(shí)際進(jìn)行了更新。使用大于號(hào) (>) 檢查 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)制引用

17、完整性(有關(guān)表的主鍵和外鍵之間關(guān)系的規(guī)則),請(qǐng)使用主鍵和外鍵約束(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

18、 觸發(fā)器。如果同一表上還有其它 AFTER 觸發(fā)器,則這些觸發(fā)器將以隨機(jī)順序執(zhí)行。如果 ALTER TRIGGER 語句更改了第一個(gè)或最后一個(gè)觸發(fā)器,則將除去已修改觸發(fā)器上設(shè)置的第一個(gè)或最后一個(gè)特性,而且必須用 sp_settriggerorder 重置排序值。只有當(dāng)觸發(fā) SQL 語句(包括所有與更新或刪除的對(duì)象關(guān)聯(lián)的引用級(jí)聯(lián)操作和約束檢查)成功執(zhí)行后,AFTER 觸發(fā)器才會(huì)執(zhí)行。AFTER 觸發(fā)器檢查觸發(fā)語句的運(yùn)行效果,以及所有由觸發(fā)語句引起的 UPDATE 和 DELETE 引用級(jí)聯(lián)操作的效果。觸發(fā)器限制CREATE TRIGGER 必須是批處理中的第一條語句,并且只能應(yīng)用到一個(gè)表中。 觸

19、發(fā)器只能在當(dāng)前的數(shù)據(jù)庫中創(chuàng)建,不過觸發(fā)器可以引用當(dāng)前數(shù)據(jù)庫的外部對(duì)象。 如果指定觸發(fā)器所有者名稱以限定觸發(fā)器,請(qǐng)以相同的方式限定表名。 在同一條 CREATE TRIGGER 語句中,可以為多種用戶操作(如 INSERT 和 UPDATE)定義相同的觸發(fā)器操作。 如果一個(gè)表的外鍵在 DELETE/UPDATE 操作上定義了級(jí)聯(lián),則不能在該表上定義 INSTEAD OF DELETE/UPDATE 觸發(fā)器。在觸發(fā)器內(nèi)可以指定任意的 SET 語句。所選擇的 SET 選項(xiàng)在觸發(fā)器執(zhí)行期間有效,并在觸發(fā)器執(zhí)行完后恢復(fù)到以前的設(shè)置。與使用存儲(chǔ)過程一樣,當(dāng)觸發(fā)器激發(fā)時(shí),將向調(diào)用應(yīng)用程序返回結(jié)果。若要避免由

20、于觸發(fā)器激發(fā)而向應(yīng)用程序返回結(jié)果,請(qǐng)不要包含返回結(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 T

21、ABLE 語句的權(quán)限默認(rèn)授予表所有者且不可轉(zhuǎn)讓,所以只有表所有者才需要考慮無意中用 TRUNCATE TABLE 語句規(guī)避 DELETE 觸發(fā)器的問題。無論有日志記錄還是無日志記錄,WRITETEXT 語句都不激活觸發(fā)器。觸發(fā)器中不允許以下 Transact-SQL 語句:ALTER DATABASECREATE DATABASEDISK INITDISK RESIZEDROP DATABASELOAD DATABASELOAD LOGRECONFIGURERESTORE DATABASERESTORE LOG  說明  由于 SQL Server 不支

22、持系統(tǒng)表中的用戶定義觸發(fā)器,因此建議不要在系統(tǒng)表中創(chuàng)建用戶定義觸發(fā)器。 多個(gè)觸發(fā)器SQL Server 允許為每個(gè)數(shù)據(jù)修改事件(DELETE、INSERT 或 UPDATE)創(chuàng)建多個(gè)觸發(fā)器。例如,如果對(duì)已有 UPDATE 觸發(fā)器的表執(zhí)行 CREATE TRIGGER FOR UPDATE,則將創(chuàng)建另一個(gè)更新觸發(fā)器。在早期版本中,在每個(gè)表上,每個(gè)數(shù)據(jù)修改事件(INSERT、UPDATE 或 DELETE)只允許有一個(gè)觸發(fā)器。 說明  如果觸發(fā)器名稱不同,則 CREATE TRIGGER(兼容級(jí)別為 70)的默認(rèn)行為是在現(xiàn)有的觸發(fā)器中添加其它觸發(fā)器。如果觸發(fā)器名稱相同

23、,則 SQL Server 返回一條錯(cuò)誤信息。但是,如果兼容級(jí)別等于或小于 65,則使用 CREATE TRIGGER 語句創(chuàng)建的新觸發(fā)器將替換同一類型的任何現(xiàn)有觸發(fā)器,即使觸發(fā)器名稱不同。有關(guān)更多信息,請(qǐng)參見 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ā)并更

24、新 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 語句相對(duì)應(yīng)的行。說明  只有啟用 sp_dboption 的 recur

25、sive triggers 設(shè)置,才會(huì)發(fā)生上述行為。對(duì)于為給定事件定義的多個(gè)觸發(fā)器,并沒有確定的執(zhí)行順序。每個(gè)觸發(fā)器都應(yīng)是自包含的。 禁用 recursive triggers 設(shè)置只能禁止直接遞歸。若要也禁用間接遞歸,請(qǐng)使用 sp_configure 將 nested triggers 服務(wù)器選項(xiàng)設(shè)置為 0。如果任一觸發(fā)器執(zhí)行了 ROLLBACK TRANSACTION 語句,則無論嵌套級(jí)是多少,都不會(huì)進(jìn)一步執(zhí)行其它觸發(fā)器。嵌套觸發(fā)器觸發(fā)器最多可以嵌套 32 層。如果一個(gè)觸發(fā)器更改了包含另一個(gè)觸發(fā)器的表,則第二個(gè)觸發(fā)器將激活,然后該觸發(fā)器可以再調(diào)用第三個(gè)觸發(fā)器,依此類推。如果鏈中任

26、意一個(gè)觸發(fā)器引發(fā)了無限循環(huán),則會(huì)超出嵌套級(jí)限制,從而導(dǎo)致取消觸發(fā)器。若要禁用嵌套觸發(fā)器,請(qǐng)用 sp_configure 將 nested 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 存儲(chǔ)過程、觸發(fā)器和批處理引用編譯時(shí)不存在的表。這種能力稱為延遲名稱解析。但是,如果 Transact-SQL 存儲(chǔ)過程、觸發(fā)器或批處理引用在存儲(chǔ)過程或觸發(fā)器中定義的表,則只有當(dāng)兼容級(jí)別設(shè)置(通過執(zhí)行 sp

27、_dbcmptlevel 設(shè)置)等于 65 時(shí),才會(huì)在創(chuàng)建時(shí)發(fā)出警告。如果使用批處理,則在編譯時(shí)發(fā)出警告。如果引用的表不存在,將在運(yùn)行時(shí)返回錯(cuò)誤信息。有關(guān)更多信息,請(qǐng)參見延遲名稱解析和編譯。 權(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

28、 觸發(fā)器,用戶必須在該視圖中有 INSERT、DELETE 和 UPDATE 特權(quán),以對(duì)該視圖發(fā)出 INSERT、DELETE 和 UPDATE 語句,而不管實(shí)際上是否在視圖上執(zhí)行了這樣的操作。示例A. 使用帶有提醒消息的觸發(fā)器當(dāng)有人試圖在 titles 表中添加或更改數(shù)據(jù)時(shí),下例將向客戶端顯示一條消息。說明  消息 50009 是 sysmessages 中的用戶定義消息。有關(guān)創(chuàng)建用戶定義消息的更多信息,請(qǐng)參見 sp_addmessage。  USE pubsIF EXISTS (SELECT name FROM

29、 sysobjects      WHERE name = 'reminder' AND type = 'TR')   DROP TRIGGER reminderGOCREATE TRIGGER reminderON titlesFOR INSERT, UPDATE AS RAISERROR (5

30、0009, 16, 10)GOB. 使用帶有提醒電子郵件的觸發(fā)器當(dāng) titles 表更改時(shí),下例將電子郵件發(fā)送給指定的人員 (MaryM)。USE pubsIF EXISTS (SELECT name FROM sysobjects      WHERE name = 'reminder' AND type = 'TR')   

31、;DROP TRIGGER reminderGOCREATE TRIGGER reminderON titlesFOR INSERT, UPDATE, DELETE AS   EXEC master.xp_sendmail 'MaryM',       'Don''t forget to print a

32、60;report for the distributors.'GOC. 在 employee 和 jobs 表之間使用觸發(fā)器業(yè)務(wù)規(guī)則由于 CHECK 約束只能引用定義了列級(jí)或表級(jí)約束的列,表間的任何約束(在下例中是指業(yè)務(wù)規(guī)則)都必須定義為觸發(fā)器。下例創(chuàng)建一個(gè)觸發(fā)器,當(dāng)插入或更新雇員工作級(jí)別 (job_lvls) 時(shí),該觸發(fā)器檢查指定雇員的工作級(jí)別(由此決定薪水)是否處于為該工作定義的范圍內(nèi)。若要獲得適當(dāng)?shù)姆秶?,必須引?jobs 表。USE pubsIF EXISTS (SELECT name FROM&

33、#160;sysobjects      WHERE name = 'employee_insupd' AND type = 'TR')   DROP TRIGGER employee_insupdGOCREATE TRIGGER employee_insupdON employeeFOR INSERT, UPDATEAS/*/*

34、60;Get the range of level for this job type from the jobs table. */DECLARE min_lvl tinyint,   max_lvl tinyint,   emp_lvl tinyint,   job_id smallintSELECT min_lv

35、l = min_lvl,    max_lvl = max_lvl,    emp_lvl = i.job_lvl,   job_id = i.job_idFROM employee e INNER JOIN inserted i ON e.emp_id = i.emp_id   

36、; JOIN jobs j ON j.job_id = i.job_idIF (job_id = 1) and (emp_lvl <> 10) BEGIN   RAISERROR ('Job id 1 expects the default level of 10.', 16, 1

37、)   ROLLBACK TRANSACTIONENDELSEIF NOT (emp_lvl BETWEEN min_lvl AND max_lvl)BEGIN   RAISERROR ('The level for job_id:%d should be between %d and %d.',    

38、0; 16, 1, job_id, min_lvl, max_lvl)   ROLLBACK TRANSACTIONENDD. 使用延遲名稱解析下例創(chuàng)建兩個(gè)觸發(fā)器以說明延遲名稱解析。 USE pubsIF EXISTS (SELECT name FROM sysobjects      WHERE name = 'trig1' AN

39、D type = 'TR')   DROP TRIGGER trig1GO- Creating a trigger on a nonexistent table.CREATE TRIGGER trig1on authorsFOR INSERT, UPDATE, DELETEAS    SELECT a.au_lname,&

40、#160;a.au_fname,     FROM authors a INNER JOIN does_not_exist x       ON a.au_id = x.au_idGO- Here is the statement to actually see the text

41、0;of the trigger.SELECT o.id, c.textFROM sysobjects o INNER JOIN syscomments c    ON o.id = c.idWHERE o.type = 'TR' and  = 'trig1'- Creating a 

42、trigger on an existing table, but with a nonexistent - column.USE pubsIF EXISTS (SELECT name FROM sysobjects      WHERE name = 'trig2' AND type = &

43、#39;TR')   DROP TRIGGER trig2GOCREATE TRIGGER trig2 ON authorsFOR INSERT, UPDATEAS    DECLARE fax varchar(12)   SELECT fax = phone      FROM autho

44、rsGO- Here is the statement to actually see the text of the trigger.SELECT o.id, c.textFROM sysobjects o INNER JOIN syscomments c    ON o.id = c.idWHERE o.type&

45、#160;= 'TR' and  = 'trig2'E. 使用 COLUMNS_UPDATED下例創(chuàng)建兩個(gè)表:一個(gè) employeeData 表和一個(gè) auditEmployeeData 表。人力資源部的成員可以修改 employeeData 表,該表包含敏感的雇員薪水信息。如果更改了雇員的社會(huì)保險(xiǎn)號(hào)碼 (SSN)、年薪或銀行帳戶,則生成審核記錄并插入到 auditEmployeeData 審核表。通過使用 COLUMNS_UPDATED() 功能,可以快速測(cè)試對(duì)這些包含敏感雇員信息的列所做的更改。只

46、有在試圖檢測(cè)對(duì)表中的前 8 列所做的更改時(shí),COLUMNS_UPDATED() 才起作用。USE pubsIF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES   WHERE TABLE_NAME = 'employeeData')   DROP TABLE employeeDataIF EXISTS(SELECT TABLE_NAME&

47、#160;FROM INFORMATION_SCHEMA.TABLES   WHERE TABLE_NAME = 'auditEmployeeData')   DROP TABLE auditEmployeeDataGOCREATE TABLE employeeData (   emp_id int NOT NULL,   emp_bankA

48、ccountNumber char (10) NOT NULL,   emp_salary int NOT NULL,   emp_SSN char (11) NOT NULL,   emp_lname nchar (32) NOT NULL,   emp_fname nchar (32) NOT&

49、#160;NULL,   emp_manager int NOT NULL   )GOCREATE TABLE auditEmployeeData (   audit_log_id uniqueidentifier DEFAULT NEWID(),   audit_log_type char (3) NOT NULL,  

50、60;audit_emp_id int NOT NULL,   audit_emp_bankAccountNumber char (10) NULL,   audit_emp_salary int NULL,   audit_emp_SSN char (11) NULL,   audit_user sysname DEFAULT SUSE

51、R_SNAME(),   audit_changed datetime DEFAULT GETDATE()   )GOCREATE TRIGGER updEmployeeData ON employeeData FOR update AS/*/*Check whether columns 2, 3 or 4 has been updated.

52、60;If any or all of columns 2, 3 or 4 have been changed, create an audit record. The bitmask is: power(2,(2-1)+power(2,(3-1)+power(2,(4-1) = 14. To check if all colu

53、mns 2, 3, and 4 are updated, use = 14 in place of >0 (below).*/   IF (COLUMNS_UPDATED() & 14) > 0/*/*Use IF (COLUMNS_UPDATED() & 14) = 14 to&

54、#160;see if all of columns 2, 3, and 4 are updated.*/      BEGIN- Audit OLD record.      INSERT INTO auditEmployeeData        

55、; (audit_log_type,         audit_emp_id,         audit_emp_bankAccountNumber,         audit_emp_salary,         aud

56、it_emp_SSN)         SELECT 'OLD',             del.emp_id,            del.emp_bankAccountNumber,   

57、0;        del.emp_salary,            del.emp_SSN         FROM deleted del- Audit NEW record.      IN

58、SERT INTO auditEmployeeData         (audit_log_type,         audit_emp_id,         audit_emp_bankAccountNumber,       &#

59、160; audit_emp_salary,         audit_emp_SSN)         SELECT 'NEW',            ins.emp_id,       

60、     ins.emp_bankAccountNumber,            ins.emp_salary,            ins.emp_SSN         FROM inserted ins   ENDGO/*/*Inserting a new employee does not cause the UPDATE trigger to fire.*/INSERT INTO employeeData   VALUES ( 101, 'U

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論