SQL-SERVER觸發器

1、觸發器。

  定義: 何爲觸發器?在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,           --歸還時間
    ...
  )

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

  這時候可以用到觸發器。對於1,創建一個Update觸發器:

  Create Trigger truStudent
    On Student
    for Update   --觸發器類型--Update
  -------------------------------------------------------
  --Name:truStudent
  --func:更新BorrowRecord 的StudentID,與Student同步。
  --Use :None
  --User:System
  --Author: wp_love
  --Date : 2003-4-16
  --Memo : 臨時寫寫的,給大家作個Sample。沒有調試阿。
  -------------------------------------------------------
  As
    if Update(StudentID)
    begin

    Update BorrowRecord 
      Set br.StudentID=i.StudentID
      From BorrowRecord br , Deleted d ,Inserted i 
      Where br.StudentID=d.StudentID

    end     
          
  理解觸發器裏面的兩個臨時的表:Deleted , Inserted 。注意Deleted 與Inserted分別表示觸發事件的表“舊的一條記錄”和“新的一條記錄”。
  一個Update 的過程可以看作爲:生成新的記錄到Inserted表,複製舊的記錄到Deleted表,然後刪除Student記錄並寫入新紀錄。

  對於2,創建一個Delete觸發器
  Create trigger trdStudent
      On Student
      for Delete
  -------------------------------------------------------
  --Name:trdStudent
  --func:同時刪除 BorrowRecord 的數據
  --Use :None
  --User:System
  --Author: 
  --Date : 2003-4-16
  --Memo : 臨時寫寫的,給大家作個Sample。沒有調試阿。
  -------------------------------------------------------
  As
    Delete BorrowRecord 
    From BorrowRecord br , Delted d
    Where br.StudentID=d.StudentID

  從這兩個例子我們可以看到了觸發器的關鍵:A.2個臨時的表;B.觸發機制。
  這裏我們只講解最簡單的觸發器。複雜的容後說明。

INSTEAD OF
執行觸發器語句,但不執行觸發觸發器的 SQL 語句,比如試圖刪除一條記錄時,將執行觸發器指定的語句,此時不再執行 delete 語句。例:
create trigger f
on tbl
instead of delete
as
    insert into Logs...

IF UPDATE(列名)
檢查是否更新了某一列,用於 insert 或 update,不能用於 delete。例:
create trigger f
on tbl
for update
as
    if update(status) or update(title)
        sql_statement --更新了 status 或 title 列

inserted、deleted
這是兩個虛擬表,inserted 保存的是 insert 或 update 之後所影響的記錄形成的表,deleted 保存的是 delete 或 update 之前所影響的記錄形成的表。例:
create trigger tbl_delete
on tbl
for delete
as
    declare @title varchar(200)
    select @title=title from deleted
    insert into Logs(logContent) values('刪除了 title 爲:' + title + '的記錄')
說明:如果向 inserted 或 deleted 虛擬表中取字段類型爲 text、image 的字段值時,所取得的值將會是 null。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章