Sql Server?觸發器實現多表之間同步增加、刪除與更新
定義: 何為觸發器?在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.觸發機制。
這里我們只講解最簡單的觸發器。復雜的容后說明。