觸發器是一種特殊型別的儲存過程,它會在指定的表/檢視資料發生變化時自動執行,一般用於insert、update、delete操作配合使用。
ps:之前團隊遇到過繁瑣儲存過程優化,想做成事務中包含觸發器配合使用,但是發現其執行方式是阻塞式的,並沒有做到實際優化(後來採用sql訊息佇列的方式進行非同步處理,此處不再擴充套件討論,後續進行深入**)。
簡單觸發器語法為:create trigger a on table(view) for delete(insert/update) as sql
使用示例如下:
1.建測試表,插入兩條資料
create
table
student
(pkid int identity(1
,1)not
null
,name nvarchar(50
) not null
,age int)
insert into student values
('張三'
,'18'
)insert into student values
('李四'
,'19'
)
2.建立觸發器(delete時觸發)
create trigger trigdeletestu
on student
fordelete
as insert into student values
('刪除'
,'0'
)
3.效果測試
select *
from student
delete student where name=
'李四'
select *
from student
結果如下:
第一次查詢:表中有張
三、李四資料;
刪除動作後,觸發器執行!
第二次查詢:李四被刪除,表中有張
三、刪除資料。
一、deleted、inserted表
觸發器在執行時會產生兩張表:deleted和inserted,分別是刪除表和插入表。
在這兩張表中,我們可以看到一些正在操作的資料!
擴充套件示例如下:
1.建測試表,插入兩條資料(語句如上,不再贅述);
2.建立觸發器(delete時觸發)
create trigger trigdeletestu
on student
fordelete
as begin
select *
from deleted
insert into student values
('刪除'
,'0'
)end
3.效果測試
delete student where name=
'李四'
結果如下:
雖然只執行了刪除操作,但是觸發器中存在查詢語句,並且將刪除動作的資料從deleted表中查詢了出來!
二、for 、after、 instead of區別
for、after
for和after的效果一樣,都是sql語句操作執行後才去執行觸發器內容。
instead of
insead of是將sql語句操作指令交給觸發器去判斷執行,即系統不直接對錶執行操作,而是把操作內容交給觸發器,讓觸發器自己判斷語句執行是否有誤,從而進行其他正常語句執行還是回滾事務。
具體示例如下:
1.建學生表和成績表(包含主外來鍵關係)
create
table
student
(studentno nvarchar(50
)primary
key,name nvarchar(50
) not null
,age int)
create
table
mark
(pkid int identity(1
,1)not
null
,studentno nvarchar(50
)foreign
keyreferences
student
(studentno)
,subjectname nvarchar(50
),mark int )
2.分別插入幾條測試資料
insert into student values
('a001'
,'張三',18
),('a002'
,'李四',17
),('a003'
,'王五',19
)insert into mark
(studentno,subjectname,mark)
values
('a001'
,'語文',50
),('a001'
,'數學'
,100),
('a001'
,'英語',60
),('a002'
,'語文',90
),('a002'
,'數學',50
),('a002'
,'英語',80
),('a003'
,'語文',95
),('a003'
,'數學',98
),('a003'
,'英語',90
)
3.建立for型別觸發器並測試結果
create trigger fortrigdelstu
on student
fordelete
as begin
delete mark where studentno in
(select studentno from deleted)
enddelete student where name=
'李四'
結果如下:
由於mark外來鍵是student 的主鍵,兩表相互連線,此時就會出錯!
4.建立instead of型別觸發器並測試結果
create trigger insteadtrigdelstu
on student
instead of
delete
as begin
delete mark where studentno in
(select studentno from deleted)
enddelete student where name=
'李四'
結果如下:
成功執行兩表刪除操作!
這裡需要特別注意的是:instead of觸發器只是對操作語句的乙個判斷,真正執行的動作只是觸發器裡面的內容!!!
即:上述觸發器刪除的只是mark表中李四的成績,但是student表中的李四資料仍然存在,這部分需要特別注意下!
1.常用觸發器的原因一般是:操作某一表資料時需要對其他表進行聯合操作。
如:學生表刪除學生,同時需要刪除成績表、選課表等其他表中該學生的資料。
2.使用觸發器注意for和instead of的使用區別!
3.目前我使用的觸發器型別一般是dml型別觸發器(表資料的插入、更新、刪除),另外還有ddl型別(建表/檢視、改表/檢視、刪表/檢視),由於使用較少了解不多,在此就不多擴充套件了,以後有機會再深入學習吧。
mysql觸發器的學習以及使用
觸發器 trigger 監控某資料操作 insert update delete 並觸發相應的操作 insert update delete 觸發器幾個概念 監視地點table 監視事件insert update delete 觸發時間after before 觸發事件insert update d...
sql觸發器的使用
觸發器的幾條效果語句 after在觸發事件之後 befor 在觸發器之前 insert 觸發的條件 update 更新事件 delete 刪除事件 insert 插入事件 例項 delimiter 把語句結束符號換成 因為trigger中會用到 create trigger t1 after ins...
sql觸發器入門學習
先說一下sql中觸發器的概念 觸發器是一種特殊的儲存過程,被定義為在對特定表或檢視發出update insert delete?語句時自動執行 附 所謂事務是使用者定義的乙個資料庫操作序列,這些操作要麼全做要麼全不做,是乙個不可分割的工作單位。例如,在關聯式資料庫中,乙個事務可以是一條sql語句 一...