| 導購 | 订阅 | 在线投稿
分享
 
 
 

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

來源:互聯網  2008-06-24 08:57:03  評論

觸發器語句中使用了兩種特殊的表: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表有數據(舊數據)

觸發器語句中使用了兩種特殊的表: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表有數據(舊數據)
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有