sql觸發器(insert,update,delete)
(2012-04-09 17:01:01)
--insert 觸發器
create trigger tri_insert
on student --將要進行更改的表名 for insert --給表插入一條數據的時候觸發
as
declare @student_id char(10) --定義一個變量 select @student_id=s.student_id from --把查詢出的指定字段的值賦值給變量 student s inner join inserted i
on s.student_id=i.student_id
if @student_id='0000000001'
begin
raiserror('不能插入1的學號!',16,8)
rollback tran
end
go
--update觸發器
create trigger tri_update
on student --將要進行更改的表名
for update --給表修改一條數據的時候觸發
as
if update(student_id)
begin
raiserror('學號不能修改!',16,8)
rollback tran
end
go
--delete觸發器
create trigger tri_delete
on student --將要進行更改的表名 for delete --給表刪除一條數據的時候觸發
as
declare @student_id varchar(10)
select @student_id=student_id from deleted
if @student_id='admin'
begin
raiserror('錯誤',16,8)
rollback tran
end
解釋:
在刪除(delete)數據的時候,可以假定數據庫將要刪除的數據放到一個deleted臨時表中,我們可以向讀取普通的表一樣,select 字段 from deleted
而insert的時候道理一樣,只不過是把要插入的數據放在inserted表中。
更新操作可以認為是執行了兩個操作,先把那一行記錄delete掉,然后再insert,這樣update操作實際上就對deleted表和 inserted表的操作,所以不會有updated表了,有的時候兩個表是主外鍵關系,想刪除主表數據的同時把子表相關的數據也刪除,這個時候如果用觸 發器就沒有效果了,因為這個觸發器是在你刪除表后才觸發的,這個時候直接終止,提示“有主外鍵關系,不能刪除等”,所有這樣的刪除觸發器是沒有效果的
mysql觸發器四要素:
監視地點:監視的哪個表?
監視操作:insert,update,delete?
觸發操作:insert,update,delete?
觸發時間:after,before?
創建觸發器語法:
Create
trigger triggerName
after/before
insert/update/delete on tableName
for each row #mysql此處寫死,僅支持行觸發,oracle、sql_server支持表觸發#
Begin
sql語句 #一句或多句 insert/update/delete語句#
End
刪除觸發器語法:
Drop trigger triggerName;
顯示已有觸發器語法:
Show triggers
對insert而言,新插入的行用new來表示,行中每一列的值用new.列名來表示
對於delete而言,刪除的行用old來表示,行中每一列的值用old.列名來表示
對於update而言,被修改的行,修改前的數據,用old來表示,old.列名;修改后的數據,用new來表示,new.列名
after是先完成數據的增刪改,再觸發,觸發中的語句晚於數據的增刪改;
before是先觸發再做數據的增刪改,觸發中的語句先於監視的增刪改,我們有機會判斷,修改即將發生的操作
#deom1添加訂單,庫存減少(商品庫存表g,訂單表o)
delimiter $ #定義$為結束符
truncate o$ #清空table o
create trigger tg1
after insert on o
for each row
begin
update g set num=num-new.much where id=new.gid;
end$
#demo2刪除訂單,庫存增加
create trigger tg2
after delete on o
for each row
begin
update g set num=num+old.much where id=old.gid;
end$
#demo3修改訂單數量,庫存相應改變
create trigger tg3
after update on o
for each row
begin
update g set num=num+old.much-new.much where id=old.gid;
end$
#demo4before例子,判斷insert 的數據是否合法
drop trigger tg1#刪除掉之前的insert觸發器,一個action只能有一個觸發器
create trigger tg4
before insert on o
for each row
begin
if new.much>5
then set new.much=5;
end if;
update g set num=num-new.much where id=new.id;
end$