<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
觸發器是一種特殊型別的儲存過程,不由使用者直接呼叫。
建立觸發器時會對其進行定義,以便在對特定表或列作特定型別的資料修改時執行。
觸發器可以查詢其他表,而且可以包含複雜的SQL語句。 它們主要用於強制服從複雜的業務規則或要求。 例如,您可以根據客戶當前的帳戶狀態,控制是否允許插入新訂單。
觸發器也可用於強制參照完整性,以便在多個表中新增、更新或刪除行時,保留在這些表之間所定義的關係。
儘管觸發器有很多優點,但是在實際的專案開發中,特別是OOP思想的深入,觸發器的弊端也逐漸突顯,主要:
使用觸發器需慎重。
CREATE TRIGGER trigger_name ON {table_name | view_name} {FOR | After | Instead of } [ insert, update,delete ] AS sql_statement
SQL Server 包括兩種常規型別的觸發器:資料操作語言 (DML) 觸發器和資料定義語言 (DDL) 觸發器。
當INSERT、UPDATE 或 DELETE 語句修改指定表或檢視中的資料時,可以使用 DML 觸發器。
DDL 觸發器激發儲存過程以響應各種 DDL 語句,這些語句主要以CREATE、ALTER 和 DROP 開頭。 DDL 觸發器可用於管理任務,例如稽核和控制資料庫操作。
通常說的觸發器就是DML觸發器。
DML 觸發器在 INSERT、UPDATE 和 DELETE 語句上操作,並且有助於在表或檢視中修改資料時強制業務規則,擴充套件資料完整性。
DML觸發器又分以下分類:
After觸發器要求只有執行某一操作insert、update、delete之後觸發器才被觸發,且只能定義在表上。
Instead of 觸發器表示並不執行其定義的操作(insert、update、delete)而僅是執行觸發器本身。既可以在表上定義instead of觸發器,也可以在檢視上定義。
在SQL Server2005後又增加了DDL觸發器。
DDL 觸發器將激發儲存過程以響應事件。但與 DML 觸發器不同的是,它們不會為響應針對表或檢視的 UPDATE、INSERT 或 DELETE 語句而激發。相反,它們將為了響應各種資料定義語言 (DDL) 事件而激發。這些事件主要與以關鍵字 CREATE、ALTER 和 DROP 開頭的 Transact-SQL 語句對應。執行 DDL 式操作的系統儲存過程也可以激發 DDL 觸發器。
DDL 觸發器使用場合:
在觸發器實際應用中,主要還是建立約束以及級聯更新。
inserted與deleted表
觸發器有兩個特殊的表:插入表(instered表)和刪除表(deleted表)。這兩張是邏輯表也是虛表。有系統在記憶體中建立者兩張表,不會儲存在資料庫中。而且兩張表的都是唯讀的,只能讀取資料而不能修改資料。
這兩張表的結果總是與被改觸發器應用的表的結構相同。當觸發器完成工作後,這兩張表就會被刪除。Inserted表的資料是插入或是修改後的資料,而deleted表的資料是更新前的或是刪除的資料。
原理:當觸發INSERT觸發器時,新的資料行就會被插入到觸發器表和inserted表中。inserted表是一個邏輯表,它包含了已經插入的資料行的一個副本。inserted表包含了INSERT語句中已記錄的插入動作。inserted表還允許參照由初始化INSERT語句而產生的紀錄檔資料。觸發器通過檢查inserted表來確定是否執行觸發器動作或如何執行它。inserted表中的行總是觸發器表中一行或多行的副本。
場景:增加學生資訊時,要校驗其年齡,暫定其年齡必須大於18,否則新增失敗
作用:校驗約束
--觸發器新增:只允許錄取18歲以上學生 IF OBJECT_ID (N'TRIGER_Students_Insert', N'tr') IS NOT NULL DROP TRIGGER TRIGER_Students_Insert; GO CREATE TRIGGER TRIGER_Students_Insert ON Students FOR INSERT AS declare @age int select @age=COUNT(Students.ID) FROM Students INNER JOIN inserted ON Students.ID =inserted.ID PRINT @age if(@age<18) begin raiserror('學生年齡必須要大於18哦',16,8) rollback tran end
原理:可將UPDATE語句看成兩步操作:即捕獲資料前像(before image)的DELETE語句,和捕獲資料後像(after image)的INSERT語句。當在定義有觸發器的表上執行UPDATE語句時,原始行(前像)被移入到deleted表,更新行(後像)被移入到inserted表。
觸發器檢查deleted表和inserted表以及被更新的表,來確定是否更新了多行以及如何執行觸發器動作。
可以使用IF UPDATE語句定義一個監視指定列的資料更新的觸發器。這樣,就可以讓觸發器容易的隔離出特定列的活動。當它檢測到指定列已經更新時,觸發器就會進一步執行適當的動作,例如發出錯誤資訊指出該列不能更新,或者根據新的更新的列值執行一系列的動作語句。
場景:專業資訊ID修改,對應的學生資訊中專業ID也相應進行修改
--更新觸發器:更新專業ID時,同時更新學生的專業資訊 IF OBJECT_ID (N'TRIGER_Majors_Update', N'tr') IS NOT NULL DROP TRIGGER TRIGER_Majors_Update; GO CREATE TRIGGER TRIGER_Majors_Update ON Majors FOR UPDATE AS IF UPDATE(ID) UPDATE Students Set MajorID=inserted.ID FROM Students,deleted,inserted WHERE Students.MajorID = deleted.ID
原理:當觸發DELETE觸發器後,從受影響的表中刪除的行將被放置到一個特殊的deleted表中。deleted表是一個邏輯表,它保留已被刪除資料行的一個副本。deleted表還允許參照由初始化DELETE語句產生的紀錄檔資料。
使用DELETE觸發器時,需要考慮以下的事項和原則:
場景:學校某選修課取消。
處理邏輯:在刪除課程的同時,需要刪除該課程的選課資訊。
--刪除觸發器:刪除課程時,同時刪除該課程的選課資訊 IF OBJECT_ID (N'TRIGER_Courses_Delete', N'tr') IS NOT NULL DROP TRIGGER TRIGER_Courses_Delete; GO CREATE TRIGGER TRIGER_Courses_Delete ON Courses FOR DELETE AS DELETE SC FROM SC,deleted WHERE SC.CourseID = deleted.ID
用Instead Of觸發器實現與範例3相同的功能,具體實現程式碼如下:
--Instead Of觸發器:刪除課程時,同時刪除該課程的選課資訊 IF OBJECT_ID (N'TRIGER_Courses_Instead_Delete', N'tr') IS NOT NULL DROP TRIGGER TRIGER_Courses_Instead_Delete; GO CREATE TRIGGER TRIGER_Courses_Instead_Delete ON Courses Instead Of DELETE AS declare @courseId int --獲取要刪除的課程ID SELECT @courseId=ID FROM deleted --刪除選課資訊 DELETE FROM SC WHERE CourseID = @courseId --刪除課程資訊 DELETE FROM Courses WHERE ID=@courseId
drop trigger 觸發器名稱
刪除多個觸發器:drop trigger 觸發器名稱,觸發器名稱
用查詢分析器重新命名或
exec sp_rename 原名稱, 新名稱
sp_rename 是 SQL Server自帶的一個儲存過程,用於更改當前資料庫中使用者建立的物件的名稱,如表名、列表、索引名等。
select * from sysobjects where xtype='TR'
sysobjects 儲存著資料庫的物件,其中 xtype 為 TR 的記錄即為觸發器物件。在 name 一列,我們可以看到觸發器名稱。
exec sp_helptext '觸發器名稱'
sp_helptrigger 有兩個引數:第一個引數為表名;第二個為觸發器型別,為 char(6) 型別,可以是 INSERT、UPDATE、DELETE,如果省略則顯示指定表中所有型別觸發器的屬性。
exec sp_helptrigger tbl
遞迴分兩種,間接遞迴和直接遞迴。我們舉例解釋如下,假如有表1、表2名稱分別為 T1、T2,在 T1、T2 上分別有觸發器 G1、G2。
類似於間接遞迴,間接遞迴必然要形成一個環,而巢狀觸發器不一定要形成一個環,它可以 T1->T2->T3...這樣一直觸發下去,最多允許巢狀 32 層。
預設情況下是禁止直接遞迴的,要設定為允許有兩種方法:
exec sp_dboption 'dbName', 'recursive triggers', true
也可以EM:資料庫上點右鍵->屬性->選項。
預設情況下是允許間接遞迴、巢狀的,要設定為禁止有兩種方法:
exec sp_configure 'nested triggers', 0 --第二個引數為 1 則為允許
也可以EM:註冊上點右鍵->屬性->伺服器設定。
我們看到許多註冊系統在註冊後都不能更改使用者名稱,但這多半是由應用程式決定的, 如果直接開啟資料庫表進行更改,同樣可以更改其使用者名稱,在觸發器中利用回滾就可以巧妙地實現無法更改使用者名稱。
create trigger tr on 表名 for update as if update(userName) rollback tran
關鍵在最後兩句,其解釋為:如果更新了 userName 列,就回滾事務。
禁用:
alter table 表名 disable trigger 觸發器名稱
啟用:
alter table 表名 enable trigger 觸發器名稱
如果有多個觸發器,則各個觸發器名稱之間用英文逗號隔開。
如果把“觸發器名稱”換成“ALL”,則表示禁用或啟用該表的全部觸發器。
到此這篇關於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