觸發器中的inserted表和deleted表介紹

觸發器語句中使用了兩種特殊的表:deleted    表和    inserted    表。Microsoft®    SQL  Server  2000 自動創建和管理這些表。可以使用這兩個臨時的駐留內存的表測試某些數據修改的效果及設置觸發器操作的條件;然而,不能直接對錶中的數據進行更改。   
    
   inserted    和    deleted    表主要用於觸發器中:     
    
   擴展表間引用完整性。   
    
   在以視圖爲基礎的基表中插入或更新數據。   
    
   檢查錯誤並基於錯誤採取行動。   
     
   找到數據修改前後表狀態的差異,並基於此差異采取行動。     
   Deleted    表用於存儲    DELETE    和    UPDATE    語句所影響的行的複本。在執行    DELETE    或    UPDATE    語句時,行從觸發器表中刪除,並傳輸到    deleted    表中。Deleted    表和觸發器表通常沒有相同的行。   
    
   Inserted    表用於存儲    INSERT    和    UPDATE    語句所影響的行的副本。在一個插入或更新事務處理中,新建行被同時添加到    inserted    表和觸發器表中。Inserted    表中的行是觸發器表中新行的副本。   
    
   更新事務類似於在刪除之後執行插入;首先舊行被複制到    deleted    表中,然後新行被複制到觸發器表和    inserted    表中。   
    
   在設置觸發器條件時,應當爲引發觸發器的操作恰當使用    inserted    和    deleted    表。雖然在測試    INSERT    時引用    deleted    表或在測試    DELETE    時引用    inserted    表不會引起任何錯誤,但是在這種情形下這些觸發器測試表中不會包含任何行。   
    
   說明      如果觸發器操作取決於一個數據修改所影響的行數,應該爲多行數據修改(基於    SELECT    語句的    INSERT、DELETE    或    UPDATE)使用測試(如檢查    @@ROWCOUNT),然後採取相應的對策。   
    
    
   SQL    Server™    2000    不允許    AFTER    觸發器引用    inserted    和    deleted    表中的    text、ntext    或    image    列;然而,允許    INSTEAD    OF    觸發器引用這些列。有關更多信息,請參見    CREATE    TRIGGER。   
    
   在    INSTEAD    OF    觸發器中使用    inserted    和    deleted    表   
   傳遞到在表上定義的    INSTEAD    OF    觸發器的    inserted    和    deleted    表遵從與傳遞到    AFTER    觸發器的    inserted    和    deleted    表相同的規則。inserted    和    deleted    表的格式與在其上定義    INSTEAD    OF    觸發器的表的格式相同。inserted    和    deleted    表中的每一列都直接映射到基表中的列。     
    
   有關引用帶    INSTEAD    OF    觸發器的表的    INSERT    或    UPDATE    語句何時必須提供列值的規則與表沒有    INSTEAD    OF    觸發器時相同:     
   不能爲計算列或具有    timestamp    數據類型的列指定值。     
   不能爲具有    IDENTITY    屬性的列指定值,除非該列的    IDENTITY_INSERT    爲    ON。當    IDENTITY_INSERT    爲    ON    時,INSERT    語句必須提供一個值。     
   INSERT    語句必須爲所有無    DEFAULT    約束的    NOT    NULL    列提供值。   
    
   對於除計算列、標識列或    timestamp    列以外的任何列,任何允許空值的列或具有    DEFAULT    定義的    NOT    NULL    列的值都是可選的。     
   當    INSERT、UPDATE    或    DELETE    語句引用具有    INSTEAD    OF    觸發器的視圖時,數據庫引擎將調用該觸發器,而不是對任何表採取任何直接操作。即使爲視圖生成的    inserted    和    deleted    表中的信息格式與基表中的數據格式不同,該觸發器在生成執行基表中的請求操作所需的任何語句時,仍必須使用    inserted    和    deleted    表中的信息。   
    
   傳遞到在視圖上定義的    INSTEAD    OF    觸發器的    inserted    和    deleted    表格式與爲該視圖定義的    SELECT    語句的選擇列表相匹配。例如:   
    
   CREATE    VIEW    EmployeeNames    (EmployeeID,    LName,    FName)   
   AS   
   SELECT    EmployeeID,    LastName,    FirstName   
   FROM    Northwind.dbo.Employees   
    
   視圖的結果集有三列:一個    int    列和兩個    nvarchar    列。傳遞到在視圖上定義的    INSTEAD    OF    觸發器的    inserted    和    deleted    表也具有名爲    EmployeeID    的    int    列、名爲    LName    的    nvarchar    列和名爲    FName    的    nvarchar    列。   
    
   視圖的選擇列表還包含不直接映射到單個基表列的表達式。一些視圖表達式(如常量調用或函數調用)可能不引用任何列,這類表達式會被忽略。複雜的表達式會引用多列,但在    inserted    和    deleted    表中,每個插入的行僅有一個值。如果視圖中的簡單表達式引用具有複雜表達式的計算列,則這些簡單表達式也有同樣的問題。視圖上的    INSTEAD    OF    觸發器必須處理這些類型的表達式。有關更多信息,請參見視圖上    INSTEAD    OF    觸發器中的表達式和計算列。 

順便說一下,當對某張表建立觸發器後,分3種情況討論
1.插入操作(Insert)
Inserted表有數據,Deleted表無數據

2.刪除操作(Delete)
Inserted表無數據,Deleted表有數據

3.更新操作(Update)
Inserted表有數據(新數據),Deleted表有數據(舊數據)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章