1.建立觸發器的語句:
CREATE TRIGGER <觸發器名稱> <--
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <表名稱>
FOR EACH ROW
<觸發器SQL語句>
-觸發器
| 代碼如下 |
複製代碼 |
--create trigger 名字 --on 表名 --觸發動作 --for/after insert/update/delete --as --t-sql select * from shop_jb --insert into shop_xs values(6,4000,1,GETDATE(),3) -- update shop_jb set stock=stock-1 where id=6 --建立觸發器 create trigger tri1 on shop5_xs after insert as update shop3_jb set stock=stock-1 where id=6 ---觸發器更新完之後,要查看錶 create trigger tri3 on shop3_jb for update as select * from shop3_jb update shop3_jb set spec='sp-Z99' where id=2 drop trigger tri1 ---用預存程序來實現,更新完之後,要查看錶 alter proc proc1 as update shop3_jb set spec='sp-111' where id=2 select * from shop3_jb exec proc1 ---查看錶的觸發器 exec sp_helptrigger 表名 ---查看錶的內容 exec sp_helptext 觸發器名 ---刪除觸發器 drop trigger 觸發器名 |
提示:你必須擁有相當大的許可權才能建立觸發器(CREATE TRIGGER),如果你已經是Root使用者,那麼就足夠了。這跟SQL的標準有所不同。
執行個體:
example1:
建立表tab1:
| 代碼如下 |
複製代碼 |
DROP TABLE IF EXISTS tab1; CREATE TABLE tab1( tab1_id varchar(11) ); 建立表tab2: DROP TABLE IF EXISTS tab2; CREATE TABLE tab2( tab2_id varchar(11) );
|
建立觸發器:t_afterinsert_on_tab1
作用:增加tab1表記錄後自動將記錄增加到tab2表中
| 代碼如下 |
複製代碼 |
DROP TRIGGER IF EXISTS t_afterinsert_on_tab1; CREATE TRIGGER t_afterinsert_on_tab1 AFTER INSERT ON tab1 FOR EACH ROW BEGIN insert into tab2(tab2_id) values(new.tab1_id); END;
|
測試一下:
| 代碼如下 |
複製代碼 |
INSERT INTO tab1(tab1_id) values('0001');
|
看看結果估計兩個表都有相同資料!
----------練習--------
| 代碼如下 |
複製代碼 |
create trigger tri1 on shop3_jb after insert as select * from inserted insert into shop3_jb values('洗衣機','aa',200,500,getdate()) select * from shop3_jb exec sp_helptrigger shop3_jb exec sp_helptext tri1 drop trigger tri1 create trigger tri2 on shop3_jb after delete as select * from deleted delete from shop3_jb where namel='筆記本' select * from shop3_jb ---查看錶的觸發器 exec sp_helptrigger 表名 ---查看錶的內容 exec sp_helptext 觸發器名 ---刪除觸發器 drop trigger 觸發器名 select * from shop5_xs select * from shop3_jb |
補充文法
觸發器 文法
3.1 CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
trigger_time是觸發程式的動作時間。它可以是BEFORE或AFTERtrigger_event指明了啟用觸發程式的語句的類型。trigger_event可以是下述值之一:
· INSERT:將新行插入表時啟用觸發程式,例如,通過INSERT、LOAD DATA和REPLACE語句。
· UPDATE:更改某一行時啟用觸發程式,例如,通過UPDATE語句。
· DELETE:從表中刪除某一行時啟用觸發程式,例如,通過DELETE和REPLACE語句。
3.2 可能遇到的問題
如果你在觸發器裡面對剛剛插入的資料進行了 insert/update, 會造成迴圈的調用.
如:
create trigger test before update on test for each row update test set NEW.updateTime = NOW() where id=NEW.ID; END
應該使用set:
create trigger test before update on test for each row set NEW.updateTime = NOW(); END
3.3 觸發器 與預存程序
觸發程式不能調用將資料返回用戶端的儲存程式,也不能使用採用CALL語句的動態SQL
(允許儲存程式通過參數將資料返回觸發程式)。
而預存程序 可以接受參數,將結果範圍給應用程式