觸發器中的inserted表和deleted表

2022-05-03 02:39:09 字數 2652 閱讀 3723

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

觸發器中的inserted和deleted表

觸發器語句中使用了兩種特殊的表 deleted 表和 inserted 表。microsoft sql server 2000 自動建立和管理這些表。可以使用這兩個臨時的駐留記憶體的表測試某些資料修改的效果及設定觸發器操作的條件 然而,不能直接對錶中的資料進行更改。inserted和deleted表...

觸發器中的inserted和deleted

一 觸發器是一種特殊的儲存過程 它不能被顯式地呼叫 而是在往表中插入記錄 更新記錄或者刪除記錄時被自動地啟用。所以觸發器可以用來實現對錶實施複雜的完整性約 束。二 sql server為每個觸發器都建立了兩個專用表 inserted表和deleted表。這兩個表由系統來維護 它們存在於記憶體中而不是...

mysql 觸發器 臨時表 Mysql觸發器

mysql觸發器 1.建立觸發器 注意 觸發器只能建立在永久表上,不能對臨時表建立觸發器,語法如下 create trigger trigger name trigger time trigger event on table name for each row trigger stmt trigg...