1. 程式人生 > >觸發器中兩個特殊表的應用

觸發器中兩個特殊表的應用

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->

AndroidActivity之間簡單通信

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