教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Java培訓(xùn)之Sql Server 觸發(fā)器實(shí)現(xiàn)多表之間同步增加、刪除與更新

更新時間:2016年08月31日10時33分 來源:傳智播客Java培訓(xùn)學(xué)院 瀏覽次數(shù):

Sql Server 觸發(fā)器實(shí)現(xiàn)多表之間同步增加、刪除與更新

定義: 何為觸發(fā)器?在SQL Server里面也就是對某一個表的一定的操作,觸發(fā)某種條件,從而執(zhí)行的一段程序。觸發(fā)器是一個特殊的存儲過程。
     常見的觸發(fā)器有三種:分別應(yīng)用于Insert , Update , Delete 事件。(SQL Server 2000定義了新的觸發(fā)器,這里不提)

     我為什么要使用觸發(fā)器?比如,這么兩個表:

     Create Table Student(             --學(xué)生表
       StudentID int primary key,      --學(xué)號
       ....
      )

     Create Table BorrowRecord(              --學(xué)生借書記錄表
       BorrowRecord  int identity(1,1),      --流水號  
       StudentID     int ,                   --學(xué)號
       BorrowDate    datetime,               --借出時間
       ReturnDAte    Datetime,               --歸還時間
       ...
     )

分別創(chuàng)建增加、刪除、更新的觸發(fā)器(Trigger)來達(dá)到兩張表之間數(shù)據(jù)同步的目的。

1:數(shù)據(jù)同步增加:

如有兩張表——A表和B表,創(chuàng)建觸發(fā)器使當(dāng)A表插入數(shù)據(jù)后B表也同步插入數(shù)據(jù)。其中B表插入數(shù)據(jù)的字段需要同A表中的字段相對應(yīng)。

CREATE TRIGGER 觸發(fā)器名稱 
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.數(shù)據(jù)同步刪除:

如有兩張表——A表和B表,創(chuàng)建觸發(fā)器使當(dāng)A表刪除數(shù)據(jù)后B表也同步刪除數(shù)據(jù)。其中B表與A表應(yīng)有相應(yīng)主鍵關(guān)聯(lián)。

CREATE TRIGGER 觸發(fā)器名稱 
ON A表 
AFTER DELETE 
AS BEGIN DELETE B表 
WHERE 
B表主鍵 IN( 
SELECT A表主鍵
FROM DELETED) 
END

3.數(shù)據(jù)同步更新:

如有兩張表——A表和B表,創(chuàng)建觸發(fā)器使當(dāng)A表數(shù)據(jù)更新后B表也同步更新數(shù)據(jù)。

CREATE TRIGGER 觸發(fā)器名稱
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表主鍵


我為什么要使用觸發(fā)器?比如,這么兩個表:

     Create Table Student(             --學(xué)生表
       StudentID int primary key,      --學(xué)號
       ....
      )

     Create Table BorrowRecord(              --學(xué)生借書記錄表
       BorrowRecord  int identity(1,1),      --流水號  
       StudentID     int ,                   --學(xué)號
       BorrowDate    datetime,               --借出時間
       ReturnDAte    Datetime,               --歸還時間
       ...
     )

    用到的功能有:
       1.如果我更改了學(xué)生的學(xué)號,我希望他的借書記錄仍然與這個學(xué)生相關(guān)(也就是同時更改借書記錄表的學(xué)號);
       2.如果該學(xué)生已經(jīng)畢業(yè),我希望刪除他的學(xué)號的同時,也刪除它的借書記錄。
    等等。

    這時候可以用到觸發(fā)器。對于1,創(chuàng)建一個Update觸發(fā)器:

    Create Trigger truStudent
      On Student                        --在Student表中創(chuàng)建觸發(fā)器
      for Update                         --為什么事件觸發(fā)
    As                                       --事件觸發(fā)后所要做的事情
      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       
                
    理解觸發(fā)器里面的兩個臨時的表:Deleted , Inserted 。注意Deleted 與Inserted分別表示觸發(fā)事件的表“舊的一條記錄”和“新的一條記錄”。

    一個數(shù)據(jù)庫教程系統(tǒng)中有兩個虛擬表用于存儲在表中記錄改動的信息,分別是:
                            虛擬表Inserted                    虛擬表Deleted

在表記錄新增時    存放新增的記錄                        不存儲記錄
        修改時          存放用來更新的新記錄                  存放更新前的記錄
        刪除時          不存儲記錄                            存放被刪除的記錄


    一個Update 的過程可以看作為:生成新的記錄到Inserted表,復(fù)制舊的記錄到Deleted表,然后刪除Student記錄并寫入新紀(jì)錄。

    對于2,創(chuàng)建一個Delete觸發(fā)器
    Create trigger trdStudent
      On Student
      for Delete
    As
      Delete BorrowRecord 
        From BorrowRecord br , Delted d
        Where br.StudentID=d.StudentID

    從這兩個例子我們可以看到了觸發(fā)器的關(guān)鍵:A.2個臨時的表;B.觸發(fā)機(jī)制。
    這里我們只講解最簡單的觸發(fā)器。復(fù)雜的容后說明。


本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/javaee

0 分享到:
和我們在線交談!