SqlServer觸發(fā)器詳解
觸發(fā)器(trigger)是SQL server 提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的存儲過程,它的執(zhí)行不是由程序調用,也不是手工啟動,而是由事件來觸發(fā),比如當對一個表進行操作( insert,delete, update)時就會激活它執(zhí)行。
觸發(fā)器經常用于加強數據的完整性約束和業(yè)務規(guī)則等。 觸發(fā)器可以從 DBA_TRIGGERS ,USER_TRIGGERS 數據字典中查到。SQL3的觸發(fā)器是一個能由系統(tǒng)自動執(zhí)行對數據庫修改的語句。
觸發(fā)器可以查詢其他表,而且可以包含復雜的SQL語句。它們主要用于強制服從復雜的業(yè)務規(guī)則或要求。例如:您可以根據客戶當前的帳戶狀態(tài),控制是否允許插入新訂單。
觸發(fā)器也可用于強制引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關系。然而,強制引用完整性的最好方法是在相關表中定義主鍵和外鍵約束。如果使用數據庫關系圖,則可以在表之間創(chuàng)建關系以自動創(chuàng)建外鍵約束。
觸發(fā)器與存儲過程的唯一區(qū)別是觸發(fā)器不能執(zhí)行EXECUTE語句調用,而是在用戶執(zhí)行Transact-SQL語句時自動觸發(fā)執(zhí)行。
查詢數據庫中所有觸發(fā)器:
select * from sysobjects where xtype='TR'
1、語法
create trigger [shema_name . ] trg_name
on { table | view }
[ with encryption ]
{ for | after | instead of }
{ insert , update , delete }
as
sql_statement
insert觸發(fā)器實例
create trigger test on al for insert as declare @id int,@uid int,@lid int,@result char select @id=id,@uid=uid,@lid=lid,@result=result from inserted if(@lid=4) begin update al set uid=99 where id=@id print 'lid=4時自動修改用戶id為99' end
update觸發(fā)器實例
create trigger test_update on al for update as declare @oldid int,@olduid int,@oldlid int,@newid int,@newuid int,@newlid int select @oldid=id,@olduid=uid,@oldlid=lid from deleted; select @newid=id,@newuid=uid,@newlid=lid from inserted if(@newlid>@oldlid) begin print 'newlid>oldid' rollback tran; end else print '修改成功'
delete觸發(fā)器實例
create trigger test_delete on al for delete as declare @did int,@duid int,@dlid int select @did=id,@duid=uid,@dlid=lid from deleted if(exists(select * from list where @dlid=id)) begin print '無法刪除' rollback tran; end else print '刪除成功'
圖文介紹觸發(fā)器
數據庫運行環(huán)境SqlServer2005
觸發(fā)器(trigger)是個特殊的存儲過程,它的執(zhí)行不是由程序調用,也不是手工啟動,而是由事件來觸發(fā),當對一個表進行操作( insert,delete, update)時就會激活它執(zhí)行,觸發(fā)器經常用于加強數據的完整性約束和業(yè)務規(guī)則等。其實往簡單了說,就是觸發(fā)器就是一個開關,負責燈的亮與滅,你動了,它就亮了,就這個意思。

觸發(fā)器的分類
1 DML( 數據操縱語言 Data Manipulation Language)觸發(fā)器:是指觸發(fā)器在數據庫中發(fā)生DML事件時將啟用。DML事件即指在表或視圖中修改數據的insert、update、delete語句。
2 DDL(數據定義語言 Data Definition Language)觸發(fā)器:是指當服務器或數據庫中發(fā)生(DDL事件時將啟用。DDL事件即指在表或索引中的create、alter、drop語句也。
3 登陸觸發(fā)器:是指當用戶登錄SQL SERVER實例建立會話時觸發(fā)。
DML觸發(fā)器介紹
1 在SQL SERVER 2008中,DML觸發(fā)器的實現(xiàn)使用兩個邏輯表DELETED和INSERTED。這兩個表是建立在數據庫服務器的內存中,我們只有只讀的權限。DELETED和INSERED表的結構和觸發(fā)器所在的數據表的結構是一樣的。當觸發(fā)器執(zhí)行完成后,它們也就會被自動刪除:INSERED表用于存放你在操件insert、update、delete語句后,更新的記錄。比如你插入一條數據,那么就會把這條記錄插入到INSERTED表:DELETED表用于存放你在操作 insert、update、delete語句前,你創(chuàng)建觸發(fā)器表中數據庫。
2 觸發(fā)器可通過數據庫中的相關表實現(xiàn)級聯(lián)更改,可以強制比用CHECK約束定義的約束更為復雜的約束。與 CHECK 約束不同,觸發(fā)器可以引用其它表中的列,例如觸發(fā)器可以使用另一個表中的 SELECT 比較插入或更新的數據,以及執(zhí)行其它操作。觸發(fā)器也可以根據數據修改前后的表狀態(tài),再行采取對策。一個表中的多個同類觸發(fā)器(INSERT、UPDATE 或 DELETE)允許采取多個不同的對策以響應同一個修改語句。
3 與此同時,雖然觸發(fā)器功能強大,輕松可靠地實現(xiàn)許多復雜的功能,為什么又要慎用?過多觸發(fā)器會造成數據庫及應用程序的維護困難,同時對觸發(fā)器過分的依賴,勢必影響數據庫的結構,同時增加了維護的復雜程序。
觸發(fā)器步驟詳解
1 首先,我們來嘗試創(chuàng)建一個觸發(fā)器,要求就是在AddTable這個表上創(chuàng)建一個Update觸發(fā)器,語句為:
create trigger mytrigger on AddTable
for update

2 然后就是sql語句的部分了,主要是如果發(fā)生update以后,要求觸發(fā)器觸發(fā)一個什么操作。這里的意思就是如果出現(xiàn)update了,觸發(fā)器就會觸發(fā)輸出:the table was updated!---By 小豬也無奈。

3 接下來我們來將AddTable表中的數據執(zhí)行一個更改的操作:

4 執(zhí)行后,我們會發(fā)現(xiàn),觸發(fā)器被觸發(fā),輸出了我們設置好的文本:

5 那觸發(fā)器創(chuàng)建以后呢,它就正式開始工作了,這時候我們需要更改觸發(fā)器的話,只需要將開始的create創(chuàng)建變?yōu)閍lter,然后修改邏輯即可:

6 如果我們想查看某一個觸發(fā)器的內容,直接運行:exec sp_helptext [觸發(fā)器名]

7 如果我想查詢當前數據庫中有多少觸發(fā)器,以方便我進行數據庫維護,只需要運行:
select * from sysobjects where xtype='TR'

8 我們如果需要關閉或者開啟觸發(fā)器的話,只需要運行:
disable trigger [觸發(fā)器名] on database --禁用觸發(fā)器
enable trigger [觸發(fā)器名] on database --開啟觸發(fā)器

9 那觸發(fā)器的功能雖大,但是一旦觸發(fā),恢復起來就比較麻煩了,那我們就需要對數據進行保護,這里就需要用到rollback數據回滾~

10 第九步的意思就是查詢AddTable表,如果里面存在TableName=newTable的,數據就回滾,觸發(fā)器中止,那我們再進行一下測試,對AddTable表進行更改,發(fā)現(xiàn),觸發(fā)update觸發(fā)器之后,因為有數據保護,觸發(fā)器中止:

注意事項
禁用和開啟觸發(fā)器都需要一定的權限,如果權限不夠是無法進行操作的。
注意運行后的錯誤提示,對于糾正錯誤是很有幫助的。
相關文章
SQL 實現(xiàn)某時間段的統(tǒng)計業(yè)務
有一張錯誤上報表,現(xiàn)在要做的是統(tǒng)計在某個時間段[beginTime,endTime](其中beginTime,endTime由前臺進行傳入)內,每個上報人上報錯誤點的總數以及已解決錯誤的總數,閑話不說,看代碼2013-01-01
Windows 11安裝SQL Server 2019出現(xiàn)"等待數據庫引擎恢復句
這篇文章主要介紹了Windows 11安裝SQL Server 2019出現(xiàn)"等待數據庫引擎恢復句柄失敗"問題完美解決方案,解決方案很簡單,格式化您的硬盤,刪除分區(qū)并重新指定扇區(qū)大小,本文給大家介紹的非常詳細,需要的朋友參考下吧2023-07-07
安裝SQL Server 2016出錯提示:需要安裝oracle JRE7 更新 51(64位)或更高版本問題的解決方法
這篇文章主要介紹了安裝SQL Server 2016出錯提示:需要安裝oracle JRE7 更新 51(64位)或更高版本問題的解決方法,需要的朋友可以參考下2018-03-03
sqlserver (parse name)字符串截取的方法
sqlserver (parse name)字符串截取的方法,需要的朋友可以參考一下2013-04-04

