Sql Server 觸發器實現多表之間同步增加、刪除與更新

轉自:http://blog.sina.com.cn/s/blog_a0912d340101gxhb.html


定義: 何爲觸發器?在SQL Server裏面也就是對某一個表的一定的操作,觸發某種條件,從而執行的一段程序。觸發器是一個特殊的存儲過程。
     常見的觸發器有三種:分別應用於Insert , Update , Delete 事件。(SQL Server 2000定義了新的觸發器,這裏不提)
     我爲什麼要使用觸發器?比如,這麼兩個表:
     Create Table Student(             --學生表
       StudentID int primary key,      --學號
       ....
      )
     Create Table BorrowRecord(              --學生借書記錄表
       BorrowRecord  int identity(1,1),      --流水號  
       StudentID     int ,                   --學號
       BorrowDate    datetime,               --借出時間
       ReturnDAte    Datetime,               --歸還時間
       ...
     )
 
分別創建增加、刪除、更新的觸發器(Trigger)來達到兩張表之間數據同步的目的。
1:數據同步增加:
如有兩張表——A表和B表,創建觸發器使當A表插入數據後B表也同步插入數據。其中B表插入數據的字段需要同A表中的字段相對應。
CREATE TRIGGER 觸發器名稱 
ON A表
AFTER INSERT 
AS BEGIN INSERT INTO 
B表(B表字段1,B表字段2,B表字段3)
SELECT A表字段1,A表字段2,A表字段3 
FROM INSERTED
END
 
2.數據同步刪除:
如有兩張表——A表和B表,創建觸發器使當A表刪除數據後B表也同步刪除數據。其中B表與A表應有相應主鍵關聯。
CREATE TRIGGER 觸發器名稱 
ON A表 
AFTER DELETE 
AS BEGIN DELETE B表 
WHERE 
B表主鍵 IN( 
SELECT A表主鍵
FROM DELETED) 
END
 
3.數據同步更新:
如有兩張表——A表和B表,創建觸發器使當A表數據更新後B表也同步更新數據。
CREATE TRIGGER 觸發器名稱
ON A表 
AFTER UPDATE 
AS 
update B表
SET 
B.B表字段1=A.A表字段1  
FROM
B表 AS B,INSERTED AS A   
WHERE B.B表主鍵=A.A表主鍵


我爲什麼要使用觸發器?比如,這麼兩個表:
     Create Table Student(             --學生表
       StudentID int primary key,      --學號
       ....
      )
     Create Table BorrowRecord(              --學生借書記錄表
       BorrowRecord  int identity(1,1),      --流水號  
       StudentID     int ,                   --學號
       BorrowDate    datetime,               --借出時間
       ReturnDAte    Datetime,               --歸還時間
       ...
     )
    用到的功能有:
       1.如果我更改了學生的學號,我希望他的借書記錄仍然與這個學生相關(也就是同時更改借書記錄表的學號);
       2.如果該學生已經畢業,我希望刪除他的學號的同時,也刪除它的借書記錄。
    等等。
    這時候可以用到觸發器。對於1,創建一個Update觸發器:
    Create Trigger truStudent
      On Student                        --在Student表中創建觸發器
      for Update                         --爲什麼事件觸發
    As                                       --事件觸發後所要做的事情
      if Update(StudentID)           
      begin
        Update BorrowRecord 
          Set StudentID=i.StudentID
          From BorrowRecord br , Deleted  d ,Inserted i     --Deleted和Inserted臨時表
          Where br.StudentID=d.StudentID
      end       
                
    理解觸發器裏面的兩個臨時的表:Deleted , Inserted 。注意Deleted 與Inserted分別表示觸發事件的表“舊的一條記錄”和“新的一條記錄”。
    一個數據庫教程系統中有兩個虛擬表用於存儲在表中記錄改動的信息,分別是:
                            虛擬表Inserted                    虛擬表Deleted
在表記錄新增時    存放新增的記錄                        不存儲記錄
        修改時          存放用來更新的新記錄                  存放更新前的記錄
        刪除時          不存儲記錄                            存放被刪除的記錄


    一個Update 的過程可以看作爲:生成新的記錄到Inserted表,複製舊的記錄到Deleted表,然後刪除Student記錄並寫入新紀錄。
    對於2,創建一個Delete觸發器
    Create trigger trdStudent
      On Student
      for Delete
    As
      Delete BorrowRecord 
        From BorrowRecord br , Delted d
        Where br.StudentID=d.StudentID
    從這兩個例子我們可以看到了觸發器的關鍵:A.2個臨時的表;B.觸發機制。
    這裏我們只講解最簡單的觸發器。複雜的容後說明。

發佈了89 篇原創文章 · 獲贊 42 · 訪問量 86萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章