sql2000觸發器

iSQlServer發表於2009-02-02

 建立觸發器,觸發器是一種特殊的儲存過程,在使用者試圖對指定的表執行指定的資料修改語句時自動執行。Microsoft® SQL Server? 允許為任何給定的 INSERT、UPDATE 或 DELETE 語句建立多個觸發器。
  
  語法
  CREATE TRIGGER trigger_name
  ON { table | view }
  [ WITH ENCRYPTION ]
  {
  { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
    [ WITH APPEND ]
    [ NOT FOR REPLICATION ]
    AS
    [ { IF UPDATE ( column )
      [ { AND | OR } UPDATE ( column ) ]
        [ ...n ]
    | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
        { comparison_operator } column_bitmask [ ...n ]
    } ]
    sql_statement [ ...n ]
  }
  }
  
  引數
  trigger_name
  
  是觸發器的名稱。觸發器名稱必須符合識別符號規則,並且在資料庫中必須唯一。可以選擇是否指定觸發器所有者名稱。
  
  Table | view
  
  是在其上執行觸發器的表或檢視,有時稱為觸發器表或觸發器檢視。可以選擇是否指定表或檢視的所有者名稱。
  
  WITH ENCRYPTION
  
  加密 syscomments 表中包含 CREATE TRIGGER 語句文字的條目。使用 WITH ENCRYPTION 可防止將觸發器作為 SQL Server 複製的一部分發布。
  
  AFTER
  
  指定觸發器只有在觸發 SQL 語句中指定的所有操作都已成功執行後才激發。所有的引用級聯操作和約束檢查也必須成功完成後,才能執行此觸發器。
  
  如果僅指定 FOR 關鍵字,則 AFTER 是預設設定。
  
  不能在檢視上定義 AFTER 觸發器。
  
  INSTEAD OF
  
  指定執行觸發器而不是執行觸發 SQL 語句,從而替代觸發語句的操作。
  
  在表或檢視上,每個 INSERT、UPDATE 或 DELETE 語句最多可以定義一個 INSTEAD OF 觸發器。然而,可以在每個具有 INSTEAD OF 觸發器的檢視上定義檢視。
  
  INSTEAD OF 觸發器不能在 WITH CHECK OPTION 的可更新檢視上定義。如果向指定了 WITH CHECK OPTION 選項的可更新檢視新增 INSTEAD OF 觸發器,SQL Server 將產生一個錯誤。使用者必須用 ALTER VIEW 刪除該選項後才能定義 INSTEAD OF 觸發器。
  
  { [DELETE] [,] [INSERT] [,] [UPDATE] }
  
  是指定在表或檢視上執行哪些資料修改語句時將啟用觸發器的關鍵字。必須至少指定一個選項。在觸發器定義中允許使用以任意順序組合的這些關鍵字。如果指定的選項多於一個,需用逗號分隔這些選項。
  
  對於 INSTEAD OF 觸發器,不允許在具有 ON DELETE 級聯操作引用關係的表上使用 DELETE 選項。同樣,也不允許在具有 ON UPDATE 級聯操作引用關係的表上使用 UPDATE 選項。
  
  WITH APPEND
  
  指定應該新增現有型別的其它觸發器。只有當相容級別是 65 或更低時,才需要使用該可選子句。如果相容級別是 70 或更高,則不必使用 WITH APPEND 子句新增現有型別的其它觸發器(這是相容級別設定為 70 或更高的 CREATE TRIGGER 的預設行為)。有關更多資訊,請參見 sp_dbcmptlevel。
  
  WITH APPEND 不能與 INSTEAD OF 觸發器一起使用,或者,如果顯式宣告 AFTER 觸發器,也不能使用該子句。只有當出於向後相容而指定 FOR 時(沒有 INSTEAD OF 或 AFTER),才能使用 WITH APPEND。以後的版本將不支援 WITH APPEND 和 FOR(將被解釋為 AFTER)。
  
  NOT FOR REPLICATION
  
  表示當複製程式更改觸發器所涉及的表時,不應執行該觸發器。
  
  AS
  
  是觸發器要執行的操作。
  
  sql_statement
  
  是觸發器的條件和操作。觸發器條件指定其它準則,以確定 DELETE、INSERT 或 UPDATE 語句是否導致執行觸發器操作。
  
  當嘗試 DELETE、INSERT 或 UPDATE 操作時,Transact-SQL語句中指定的觸發器操作將生效。
  
  觸發器可以包含任意數量和種類的 Transact-SQL 語句。觸發器旨在根據資料修改語句檢查或更改資料;它不應將資料返回給使用者。觸發器中的 Transact-SQL 語句常常包含控制流語言。CREATE TRIGGER 語句中使用幾個特殊的表:
  
  deleted 和 inserted 是邏輯(概念)表。這些表在結構上類似於定義觸發器的表(也就是在其中嘗試使用者操作的表);這些表用於儲存使用者操作可能更改的行的舊值或新值。例如,若要檢索 deleted 表中的所有值,請使用:
  SELECT *
  FROM deleted
  
  如果相容級別等於 70,那麼在 DELETE、INSERT 或 UPDATE 觸發器中,SQL Server 將不允許引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能訪問 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 觸發器中檢索新值,請將 inserted 表與原始更新表聯接。當相容級別是 65 或更低時,對 inserted 或 deleted 表中允許空值的text、ntext 或 image 列,將返回空值;如果這些列不可為空,則返回零長度字串。
  當相容級別是 80 或更高時,SQL Server 允許在表或檢視上通過 INSTEAD OF 觸發器更新 text、ntext 或 image 列。
  
  n
  
  是表示觸發器中可以包含多條 Transact-SQL 語句的佔位符。對於 IF UPDATE (column) 語句,可以通過重複 UPDATE (column) 子句包含多列。
  
  IF UPDATE (column)
  
  測試在指定的列上進行的 INSERT 或 UPDATE 操作,不能用於 DELETE 操作。可以指定多列。因為在 ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要測試在多個列上進行的 INSERT 或 UPDATE 操作,請在第一個操作後指定單獨的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 將返回 TRUE 值,因為這些列插入了顯式值或隱性 (NULL) 值。
  
  
  
  說明 IF UPDATE (column) 子句的功能等同於 IF、IF...ELSE 或 WHILE 語句,並且可以使用 BEGIN...END 語句塊。有關更多資訊,請參見控制流語言。
  
  
  可以在觸發器主體中的任意位置使用 UPDATE (column)。
  
  column
  
  是要測試 INSERT 或 UPDATE 操作的列名。該列可以是 SQL Server 支援的任何資料型別。但是,計算列不能用於該環境中。有關更多資訊,請參見資料型別。
  
  IF (COLUMNS_UPDATED())
  
  測試是否插入或更新了提及的列,僅用於 INSERT 或 UPDATE 觸發器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。
  
  COLUMNS_UPDATED 函式以從左到右的順序返回位,最左邊的為最不重要的位。最左邊的位表示表中的第一列;向右的下一位表示第二列,依此類推。如果在表上建立的觸發器包含 8 列以上,則 COLUMNS_UPDATED 返回多個位元組,最左邊的為最不重要的位元組。在 INSERT 操作中 COLUMNS_UPDATED 將對所有列返回 TRUE 值,因為這些列插入了顯式值或隱性 (NULL) 值。
  
  可以在觸發器主體中的任意位置使用 COLUMNS_UPDATED。
  
  bitwise_operator
  
  是用於比較運算的位運算子。
  
  updated_bitmask
  
  是整型位掩碼,表示實際更新或插入的列。例如,表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 觸發器,若要檢查列 C2、C3 和 C4 是否都有更新,指定值 14;若要檢查是否只有列 C2 有更新,指定值 2。
  
  comparison_operator
  
  是比較運算子。使用等號 (=) 檢查 updated_bitmask 中指定的所有列是否都實際進行了更新。使用大於號 (>) 檢查 updated_bitmask 中指定的任一列或某些列是否已更新。
  
  column_bitmask
  
  是要檢查的列的整型位掩碼,用來檢查是否已更新或插入了這些列。
  
  註釋
  觸發器常常用於強制業務規則和資料完整性。SQL Server 通過表建立語句(ALTER TABLE 和 CREATE TABLE)提供宣告引用完整性 (DRI);但是 DRI 不提供資料庫間的引用完整性。若要強制引用完整性(有關表的主鍵和外來鍵之間關係的規則),請使用主鍵和外來鍵約束(ALTER TABLE 和 CREATE TABLE 的 PRIMARY KEY 和 FOREIGN KEY 關鍵字)。如果觸發器表存在約束,則在 INSTEAD OF 觸發器執行之後和 AFTER 觸發器執行之前檢查這些約束。如果違反了約束,則回滾 INSTEAD OF 觸發器操作且不執行(激發)AFTER 觸發器。
  
  可用 sp_settriggerorder 指定表上第一個和最後一個執行的 AFTER 觸發器。在表上只能為每個 INSERT、UPDATE 和 DELETE 操作指定一個第一個執行和一個最後一個執行的 AFTER 觸發器。如果同一表上還有其它 AFTER 觸發器,則這些觸發器將以隨機順序執行。
  
  如果 ALTER TRIGGER 語句更改了第一個或最後一個觸發器,則將除去已修改觸發器上設定的第一個或最後一個特性,而且必須用 sp_settriggerorder 重置排序值。
  
  只有當觸發 SQL 語句(包括所有與更新或刪除的物件關聯的引用級聯操作和約束檢查)成功執行後,AFTER 觸發器才會執行。AFTER 觸發器檢查觸發語句的執行效果,以及所有由觸發語句引起的 UPDATE 和 DELETE 引用級聯操作的效果。
  
  觸發器限制
  CREATE TRIGGER 必須是批處理中的第一條語句,並且只能應用到一個表中。
  
  觸發器只能在當前的資料庫中建立,不過觸發器可以引用當前數

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-545032/,如需轉載,請註明出處,否則將追究法律責任。

相關文章