/*觸發器是一種不帶引數特殊的儲存過程,有使用者定義,資料庫系統根據一定的條件自動執行*/
--sql觸發器大體上可以分為4種]
--insert 觸發器:在對錶進行資料錄入的時候觸發
--delete 觸發器:刪除表中的資料的時候觸發
--instead of 觸發器:此類觸發器建立在檢視之上,用來替代相應的動作,比如delete,insert,update
--觸發器的內部可以使用commit和rollback
create table emp
(eid int primary key,
ename varchar(10),
sal money
)create trigger in_tr
on emp for insert
asbegin
if (user='dbo')
begin
print 'dbo不能錄入資料'
rollback tran
endend
insert into emp values(1001,'rose',456)
--觸發器的觸發發生在事件發生之後
--在觸發器中新增臨時錶可記錄操作
--在連線符union的各語句只觸發一次
--採用union對資料庫的資源有利
--觸發器的主要功能:對歷史資料的審計
--語句級觸發器:每語句觸發;行級觸發器:每改變一行觸發
/*inserted邏輯表*/
/*作用:insert動作發生的時候,資料首先會被放入此表中接著等待使用者的命令,
如果使用者回退事務,則清空此表的內容,如果使用者提交事務,則把此表的資料永久寫入資料庫
*/--邏輯表的結構和觸發器表的結構完全相同,存在與記憶體中
select * into new from emp where 1>2
--觸發器中:
create trigger in_tr
on emp for insert
asbegin
if (user='dbo')
begin
print 'dbo不能錄入資料'
rollback tran
insert into new select * from inserted
endend
insert into emp values(1001,'rose',456)
--邏輯表的資料將錄入new
--用於記錄使用者插入影響的行數以及資料,是否用union都會記錄正確
--各種約束優先於觸發器
/*邏輯表deleted,當delete動作發生的時候,要刪除的資料首先會被放在deleted邏輯表中,
接著等待使用者提交或者回退的命令,如果使用者提交,則清空deleted邏輯表中的資料,如果
使用者回退,則把deleted邏輯表的資料放回原地,以保證資料的一致性
*/alter trigger del_tr
on emp for delete
asbegin
if (user='dbo')
begin
print 'dbo不能錄入資料'
rollback tran
endinsert into new select * from deleted
end
delete from emp
/*乙個表可以建立多個不同型別的觸發器,也可以建立多個同型別的觸發器,
但當乙個表上存在多個相同型別的觸發器的時候,觸發器的執行順序沒有定義*/
/*update動作發生的時候,將要被更新的資料(歷史資料)首先被放在inserted邏輯表中,
接著資料庫系統等待使用者提交或者回退的命令,如果使用者提交,則清空deleted邏輯表中
的資料,把inserted邏輯表中的資料放回原地,update涉及到兩張邏輯表
邏輯表的結構與觸發器的結構完全相同
*//*instead of 觸發器*/
create view v
as select * from emp
create trigger tr_v_insert
on v instead of insert
asbegin
print'錄入資料'
end--檢視上的此觸發器出發之後,基表上的觸發器不再執行
create trigger tr
on emp for insert
asbegin
print 'insert'
end在instead of觸發器中可以使用邏輯表
--示例
create table goods
(gid int primary key,
price money,
)create trigger tr
on goods for update
asbegin
if (update(gid))
begin
print'主鍵不能更新!'
rollback
endif (update(price))
begin
print'**可以更新'
commit
endend
update goods set gid=1001
SQL之trigger(觸發器)
先來看一小段程式 有如下三張表 帳戶 編號,姓名,餘額,建立日期,儲蓄所編號 儲蓄所 編號,名稱,位址,人數,所屬城市 借貸 帳戶,借貸型別,金額,日期 1 create trigger tri bank delete 2on bank for deleteas3 declare count acc...
sql 觸發器 直接遞迴觸發器
create trigger dbo loving20000 on dbo s for delete asdeclare age int select age sage from deleted delete s where sage age delete from s where sname xq...
sql 觸發器 儲存過程 觸發器(3 3)
1 what?什麼是觸發器 trigger 前兩篇介紹了儲存過程,儲存過程可以理解為sql語句集。那麼觸發器就是一種特殊的儲存過程,也就是一群特殊的sql語句集。特殊在哪?從上文得知,儲存過程是依賴名字才被呼叫的。不僅是儲存過程,我們常用的方法等,大部分也是先知道名字,才能去使用。就像吃飯採用訂外賣...