觸發器中兩個特殊表的應用
inserted -- 更新後的表 insert和update觸發器中有
deleted -- 更新前的表 delete和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 列。
create trigger t_test on 表
for update
as
if update(判斷是否更新的欄位)
begin
select 更改前的欄位值=判斷是否更新的欄位 from deleted
select 更改後的欄位值=判斷是否更新的欄位 from inserted
end
相關推薦
觸發器中兩個特殊表的應用
inserted -- 更新後的表 insert和update觸發器中有 deleted -- 更新前的表 delete和update觸發器中有 使用 inserted 和 deleted 表 觸發器
WEB中兩個特殊的監聽器HttpSessionBindingListener和HttpSessionActivationListener (活化與鈍化)
HttpSessionBindingListener 實現此介面類的類,不必在web.xml中進行配置。 實現此介面的類,通常是一個JavaBean,一個JavaBean通過實現此介面,可以感知自己是否新增到了Session中。或是感知自己是否從Session中移除。 示例
ACCESS中兩個特殊的巨集
一.建立AutoExec巨集 如果在首次開啟資料庫時執行指定的操作,可以使用一個名為 AutoExec 的特殊巨集。該巨集可在首次開啟資料庫時執行一個或一系列的操作。開啟資料庫時,Microsoft access將查詢一個名為AutoExec的巨集,如果找到,就自動
順序表 | 根據兩個有序表查找合並後的中位數
num for 合並 return pre ret 代碼 else while 王道 P18 T11 : 寫的O(n)的代碼: int get_midNum_of_mergedList(int a[],int an,int b[],int bn){ int mid
資料結構中的兩個順序表的合併
#include <iostream> #include<stdlib.h> using namespace std; #define MAXSIZE 100 #define TRUE 1 #define FALSE 0 #define OK 1
sql 如何把一個表的查詢結果插入到另一張表中(兩個表的結構不同)
-- 如何把一個表的查詢結果插入到另一張表中(兩個表的結構不同), 插入的欄位個數和查詢的欄位個數必須一致 insert into 表名(欄位1,欄位2,欄位3...) select 欄位1,欄位2,欄位3.. from 查詢表名 where .. insert into A(id,
資料結構——找兩個單鏈表的交叉點,並將交叉點在連結串列ls1中所處的位置打印出來
1、程式檔案 I、 在交叉點/src目錄下分別建立main.c、Linklist.c檔案 //main.c #include <stdio.h> #include <stdlib.h> //包括rand()、srand()、abs()等函式 #include &
兩個資料庫表資料實時同步(sql2008 觸發器)
/****** Object: Trigger [dbo].[TR_C0T14] Script Date: 11/01/2011 13:21:04 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -
兩個資料庫表中合併資料
--忽略表之間的關聯關係ALTER TABLE db2.dbo.table NOCHECK CONSTRAINT 關係名 --將沒有重複的資料合併insert into db2.dbo.table(field1,field2...) select field1,field2.
假設利用兩個線性表La和Lb分別表示兩個集合A和B(即線性表中的資料元素即為集合中的成員),現要求一個新的 集合A=AUB。這就要求對線性表作如下操作:擴大線性表La,將存在於線性表Lb中而不存在於線
/*假設利用兩個線性表La和Lb分別表示兩個集合A和B(即線性表中的資料元素即為集合中的成員),現要求一個新的 集合A=AUB。這就要求對線性表作如下操作:擴大線性表La,將存在於線性表Lb中而不存在於線性表La中的資料元素插入 到線性表La中去,只要從線性表Lb中依次取得
二叉樹應用_樹中兩個節點的最低公共祖先
題目:給定樹中的兩個節點,找出這兩個節點的最低公共祖先。 情況1:當給定的樹為二叉搜尋樹時。 分析:由於二叉搜尋樹是排序過的,位於左子樹的節點都小於根節點,位於右子樹的節點都大於根節點。如果要查詢的兩個節點比根節點大的話,則最低公共祖先在右子樹中;如果要查詢
Excel檔案中核對兩個工作表中不同內容
兩份相同的銷售報表,要從裡面找出不同的資料要怎麼做呢?資料少的話,一看就能找出不同的;資料多的話,那要自己一個個看就沒那麼容易找出來了。今天就來跟大家分享在Excel檔案中兩個工作表如何快高效快速的核對出不同的資料內容? 我們來看下下面的兩份銷售報表,需要核對出兩表中不同的
(LeetCode)兩個鏈表的第一個公共節點
struct link note lee mono lengthb borde san length LeetCode上面的題目例如以下: Write a program to find the node at which the intersection of t
兩個鏈表的第一個公共結點
common color -c span lis class 指向 node 一個 題目 輸入兩個鏈表,找出它們的第一個公共結點。 分析 首先分別遍歷list1和list2,得到兩個鏈表的長度count1和count2,同時,判斷兩個鏈表的尾指針是否相同,如果不
#21 合並排序後的兩個鏈表
使用 ext 小技巧 鏈表 合並 lists urn amp 冗余 思路 使用三個遊標:cur指向合並後鏈表的尾部,l1,l2分別用於遍歷兩個鏈表,較小的元素增加到合並後鏈表。 小技巧 使用冗余的頭結點可以精簡地判斷一下情形,其中一個鏈表,或兩個都為空鏈表。 從而精簡代
27、輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,當然我們需要合成後的鏈表滿足單調不減規則。
-s st2 image code solution 兩個 cnblogs 思路 div 輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,當然我們需要合成後的鏈表滿足單調不減規則。 思路:同歸並算法 本題: 1 public class Solution {
java判斷兩個單鏈表是否相交
fast n) detail 無環 etl ++ code 數據 enter 轉載於:http://blog.csdn.net/happymatilian/article/details/47811161 思路: 鏈表分有環鏈表和無環鏈表,如果兩個鏈表存在相交
逆轉交替合並兩個鏈表
包含 con 技術分享 article 進行 log 輸入 帶來 方式 一、問題描寫敘述 鏈表A和B A: 1->2->3->4 B: a->b->c->d 請逆轉交替合並兩個鏈表,演示樣例結果例如以下: 4->
Android中兩個Activity之間簡單通信
idg tin test ide button ima 接收 9.png set 在Android中,一個界面被稱為一個activity,在兩個界面之間通信,采用的是使用一個中間傳話者(即Intent類)的模式,而不是直接通信。 下面演示如何實現兩個activity之間的通
兩個鏈表的交叉
ext class logs str c++ ++ write ini turn 代碼(C++): /** * Definition for singly-linked list. * struct ListNode { * int val; * ListN