天天看點

SQL Server——觸發器

什麼是觸發器?

觸發器,是一種特殊類型的存儲過程,它在指定的表中的資料發生變化時自動生效。經常通過觸發器來強制實作不同表中的邏輯相關資料的引用完整性或一緻性。觸發器主要是通過事件進行觸發而被執行的,而存儲過程可以通過過程名字而直接調用。當對某一個表進行諸如UPDATE、INSERT、DELETE這些操作時,SQL Server就會自動執行觸發器所定義的SQL語句,進而確定對資料的處理必須符合這些SQL語句所定義的規則

為什麼要使用觸發器?

  • 自動執行,它們在表的資料做了任何修改(比如手工輸入或者使用程式采集的操作)之後立即激活
  • 可以通過資料庫中的相關表進行層疊更改。這筆直接把代碼寫在前台的做法更安全合理
  • 可以強制限制,這些限制比用CHECK限制所定義的更複雜。與CHECK限制不同的是,觸發器可以引用其他表中的列

觸發器有哪些種類?

  • DDL觸發器:當伺服器或資料庫中發生資料定義語言(DDL)事件時被調用。對資料庫進行ALTER、CREATE、DROP操作時被觸發如果要執行以下操作,可以使用DDL觸發器:

要防止對資料庫架構進行某些更改;

要記錄資料庫架構中的更改或者事件

  • DML觸發器:當資料庫伺服器中發生資料操作語言(DML)事件時被觸發。将觸發器和觸發它的語句作為可在觸發器内復原的單個事務對待。如果檢測到錯誤,則整個事務自動復原

DML觸發器的種類:INSERT觸發器、UPDATE觸發器、DELETE觸發器

 文法格式是怎樣的呢?

CREATE TRIGGER trigger_name             --建立觸發器的關鍵字及觸發器的名字

ON { table | view }                                       --觸發器是基于哪個表進行建立的

{

  { { FOR | AFIER | INSTEAD OF }              --要建立觸發器的類型

     { [DELETE] [,] [INSERT] [,] [UPDATE] }    --DML的種類

       AS

       sql_statement                                            --T_SQL語句

   }

}

舉例?

建立INSERT觸發器

說明:在建立INSERT觸發器的SQL語句中,當使用者向Student表中添加學生資訊時,為了保證班級人數和學生學籍資訊表中的人數一緻,通過對班級資訊表中的班級人數自動加1設定

create trigger T_addnum
on Student
for insert
as 
	update 班級資訊 set 班級人數=班級人數+1
	where 班級編号=(select 所屬班級 from inserted)


insert into Student values('16','貝拉','女','1999-01-01','漢族')
           

建立DELETE觸發器:删除Student表中學号為17的學生資訊

--第一步,建立觸發器
create trigger T_delete
on Student
for delete
as
    select Sname as 被删除教師姓名,Sage, Ssex, 民族,所屬班級 from deleted


--第二步,建立SQL查詢
delete from Student where SId='17'
           

這時,當我們執行第二步時,系統傳回了剛才我們删除的資料:

SQL Server——觸發器

建立UPDATE觸發器

說明:判斷當使用者更新Student表中的姓名和性别這兩個基礎資料時,就觸發if...else語句,傳回設定的資訊

--建立update觸發器
create trigger T_update
on Student
for update
as
    if(update(Sname) or update(Ssex))
        begin
            print'事務不能被處理,基礎資料不能修改!'
            rollback tran
        end
    else
        print'資料修改成功!'



--修改學生的姓名,觸發update這樣一個觸發器,系統傳回錯誤資訊
update Student set Sname='王菲' where SId='16'
           

執行結果如下:

SQL Server——觸發器

因為在觸發器中已經表明了不能對姓名和性别這兩個基礎資料時進行修改,但如果我修改其他字段資訊呢?

update Student set 民族='回族' where SId='16'
           

執行結果如下:

SQL Server——觸發器

如何建立DDL觸發器?

作用:防止對資料庫的修改。保證資料庫中資料的完整性

--建立DDL觸發器,限制對資料庫進行删除和添加
create trigger T_notdelete
on database
for deop_table,alter_table
as
    print'事務不能被處理,基礎資料表不能被修改和删除!'
    rollback




--假設現要删除Student表,就觸發了剛才定義的觸發器,觸發器就起作用,目前的操作就被撤銷
drop table Student
           

執行結果如下:

SQL Server——觸發器

如何管理觸發器?

删除觸發器:drop trigger 觸發器名

嵌套觸發器是什麼?

如果一個觸發器在執行操作時引發了另一個觸發器,而這個觸發器又接着引發下一個觸發器……這些觸發器就是嵌套觸發器。觸發器最多可嵌套至 32 層

資料來源:https://www.cnblogs.com/javaca88/archive/2006/09/29/518467.html

遞歸觸發器

  • 直接遞歸:當應用程式更新表1時,引發觸發器1,而觸發器1更新了表1
  • 間接遞歸:當應用程式更新表1時,引發觸發器1,而觸發器1更新了表2,引發觸發器2,而觸發器2更新了表1

注:在資料庫中一定要先建立觸發器,應用程式才會自動觸發相應的觸發器