<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
觸發器是一種特殊的儲存過程,觸發器主要是通過事件進行觸發而被自動呼叫執行,而儲存過程必須通過儲存過程的名稱被呼叫。
觸發器是在對錶進行插入、更新或刪除操作時自動執行的特殊儲存過程。觸發器通常用於強制業務規則,觸發器是一種高階約束,可以定義比CHECK約束更為複雜的約束:可以執行復雜的SQL語句(if/while/case),可以參照其他表中的列。觸發器定義在特定的表上,與表相關,自動觸發執行,不能直接呼叫,是一個事務(可回滾)。
SQL SERVER中觸發器可以分為兩類:DML觸發器和DDL觸發器,DML觸發器針對表,DDL觸發器會影響多種資料定義語言語句而觸發,這些語句有create、alter、drop語句。
DML觸發器分為:
1、after觸發器(之後觸發)
2、instead of觸發器(之前觸發)
after觸發器要求只有執行某一操作(insert、update、delete)之後觸發器才能被觸發,且只能定義在表上。而instead of觸發器表示並不執行其定義的操作(insert、update、delete)而僅是執行觸發器本身,其優先順序高於觸發語句的執行。
觸發器有兩個特殊的表:插入表(instered表)和刪除表(deleted表)
這兩張表是邏輯表也是虛表,觸發器觸發時系統自動在記憶體中建立這兩張表,不會儲存在資料庫中。這兩張表都是唯讀的,不允許修改。這兩張表的結果總是與被觸發器應用的表的結構相同。當觸發器完成工作後,這兩張表就會被刪除。inserted表臨時儲存了插入或更新後的記錄行,可以從inserted表中檢查插入的資料是否滿足業務需求,如果不滿足,則向用戶報告錯誤訊息,並回滾插入操作。deleted表臨時儲存了刪除或更新前的記錄行,可以從deleted表中檢查被刪除的資料是否滿足業務需求,如果不滿足,則向用戶報告錯誤訊息,並回滾刪除操作。update資料的時候是先刪除表記錄,然後插入一條記錄,在inserted和deleted表就都有update後的資料記錄了。
inserted表和deleted表存放的資訊:
修改操作 | inserted表 | deleted表 |
增加(INSERT)記錄 | 存放新增的記錄 | 無 |
刪除(DELETE)記錄 | 無 | 存放被刪除的記錄 |
修改(UPDATE)記錄 | 存放更新後的記錄 | 存放更新前的記錄 |
語法:
CREATE TRIGGER trigger_name ON table_name [WITH ENCRYPTION] FOR [DELETE, INSERT, UPDATE] AS T-SQL語句 GO
WITH ENCRYPTION
表示加密觸發器定義的SQL文字
DELETE, INSERT, UPDATE
指定觸發器的型別
插入觸發器
--GradeInfo表中插入一條資料,MyStudentInfo表中插入一條記錄 IF (object_id('tr_insert','tr') is not null) drop trigger tr_insert GO CREATE trigger tr_insert on GradeInfo after insert --插入觸發 as begin --定義變數 declare @GradeId int --在inserted表中查詢已經插入記錄資訊 select @GradeId=id from INSERTED --MyStudentInfo表中插入資料 insert INTO MyStudentInfo (GradeId) VALUES (@GradeId) print '插入成功!' end
插入資料
insert INTO GradeInfo VALUES (11,'C++')
查詢資料
select * from MyStudentInfo where GradeId=11
刪除MyStudentInfo表中的資料,插入備份表
--刪除MyStudentInfo表中的資料,插入備份表 IF (object_id('tr_Delete','tr') is not null) drop TRIGGER tr_Delete GO CREATE trigger tr_Delete on MyStudentInfo for delete as begin print '正在備份資料......' IF (object_id('MyStudentInfo_Back','U') is not null) --存在表,直接插入資料 insert INTO MyStudentInfo_Back SELECT * from DELETED else select * into MyStudentInfo_Back from DELETED PRINT '備份完成' end
刪除前查詢MyStudentInfo表資料
select * from MyStudentInfo
刪除id=9的資料
delete FROM MyStudentInfo where Id=9
查詢備份表資料
select * from MyStudentInfo_Back
IF (object_id('tr_Update','tr') is not null) drop TRIGGER tr_Update GO CREATE trigger tr_Update on MyStudentInfo for update as begin --宣告變數,儲存更新前和更新後的姓名 declare @OldName varchar(16),@NewName varchar(16) select @OldName=name from DELETED print '更新前姓名:'+@OldName select @NewName=name from INSERTED print '更新後姓名:'+@NewName end
把張三更新為"張三測試"
update MyStudentInfo SET Name='張三測試' where Id=1
update更新列級觸發器
--update更新列級觸發器 IF (object_id('tr_update_column','tr') is not null) drop TRIGGER tr_update_column GO CREATE trigger tr_update_column on GradeInfo for update as begin IF(update(id)) begin print '系統提示:主鍵ID不能更新' rollback end end
更新id列
update GradeInfo SET Id=15 where Id=4
instead of觸發器表示並不執行其定義的操作(insert、update、delete)而僅是執行觸發器本身的內容,其優先順序高於定義的SQL語句的執行
語法:
create trigger tgr_name on table_name with encryption instead of update... as begin T-SQL end
建立instead of觸發器
--建立instead of觸發器 /*MyStudentInfo表裡面插入資料之前,先判斷GradeInfo表中是否有對應的班級ID,如果沒有,不允許插入,如果存在,則插入 */ IF (object_id('tr_insteadOf','tr') is not null) drop TRIGGER tr_insteadOf GO CREATE trigger tr_insteadOf on MyStudentInfo instead of insert as begin IF exists(SELECT * FROM GradeInfo WHERE Id=(SELECT GradeId FROM INSERTED)) print '該班級存在,可以插入' else begin print '該班級不存在,不可以插入' rollback end end
測試1,插入不存在的班級id
insert INTO MyStudentInfo (GradeId) VALUES (15)
測試2,插入存在的班級id
insert INTO MyStudentInfo (GradeId) VALUES (5)
create trigger tr_DDL on database for DROP_TABLE,ALTER_TABLE as begin print '別想著刪庫!好好打你的程式碼' rollback --回滾 end
測試刪除表
drop TABLE MyStudentInfo
測試修改表結構
alter table MyStudentInfo alter column Name varchar(32)
禁用DML觸發器
disable trigger tr_insteadOf on MyStudentInfo
啟用DML觸發器
enable trigger tr_insteadOf on MyStudentInfo
禁用DDL觸發器
disable trigger tr_DDL on database
啟用DDL觸發器
enable trigger tr_DDL on database
到此這篇關於SQL SERVER觸發器詳解的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45