SqlServer觸發器詳解。本站提示廣大學習愛好者:(SqlServer觸發器詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是SqlServer觸發器詳解正文
觸發器(trigger)是SQL server 供給給法式員和數據剖析員來包管數據完全性的一種辦法,它是與表事宜相干的特別的存儲進程,它的履行不是由法式挪用,也不是手工啟動,而是由事宜來觸發,好比當對一個表停止操作( insert,delete, update)時就會激活它履行。
觸發器常常用於增強數據的完全性束縛和營業規矩等。 觸發器可以從 DBA_TRIGGERS ,USER_TRIGGERS 數據字典中查到。SQL3的觸發器是一個能由體系主動履行對數據庫修正的語句。
觸發器可以查詢其他表,並且可以包括龐雜的SQL語句。它們重要用於強迫屈服龐雜的營業規矩或請求。例如:您可以依據客戶以後的帳戶狀況,掌握能否許可拔出新定單。
觸發器也可用於強迫援用完全性,以便在多個表中添加、更新或刪除行時,保存在這些表之間所界說的關系。但是,強迫援用完全性的最好辦法是在相干表中界說主鍵和外鍵束縛。假如應用數據庫關系圖,則可以在表之間創立關系以主動創立外鍵束縛。
觸發器與存儲進程的獨一差別是觸發器不克不及履行EXECUTE語句挪用,而是在用戶履行Transact-SQL語句時主動觸發履行。
查詢數據庫中一切觸發器:
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觸發器實例
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觸發器實例
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觸發器實例
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 '刪除勝利'
圖文引見觸發器
數據庫運轉情況SqlServer2005
觸發器(trigger)是個特別的存儲進程,它的履行不是由法式挪用,也不是手工啟動,而是由事宜來觸發,當對一個表停止操作( insert,delete, update)時就會激活它履行,觸發器常常用於增強數據的完全性束縛和營業規矩等。其實往簡略了說,就是觸發器就是一個開關,擔任燈的亮與滅,你動了,它就亮了,就這個意思。
觸發器的分類
1 DML( 數據把持說話 Data Manipulation Language)觸發器:是指觸發器在數據庫中產生DML事宜時將啟用。DML事宜即指在表或視圖中修正數據的insert、update、delete語句。
2 DDL(數據界說說話 Data Definition Language)觸發器:是指當辦事器或數據庫中產生(DDL事宜時將啟用。DDL事宜即指在表或索引中的create、alter、drop語句也。
3 上岸觸發器:是指當用戶登錄SQL SERVER實例樹立會話時觸發。
DML觸發器引見
1 在SQL SERVER 2008中,DML觸發器的完成應用兩個邏輯表DELETED和INSERTED。這兩個表是樹立在數據庫辦事器的內存中,我們只要只讀的權限。DELETED和INSERED表的構造和觸發器地點的數據表的構造是一樣的。當觸發器履行完成後,它們也就會被主動刪除:INSERED表用於寄存你在操件insert、update、delete語句後,更新的記載。好比你拔出一條數據,那末就會把這筆記錄拔出到INSERTED表:DELETED表用於寄存你在操作 insert、update、delete語句前,你創立觸發器表中數據庫。
2 觸發器可經由過程數據庫中的相干表完成級聯更改,可以強迫比用CHECK束縛界說的束縛更加龐雜的束縛。與 CHECK 束縛分歧,觸發器可以援用其它表中的列,例如觸發器可使用另外一個表中的 SELECT 比擬拔出或更新的數據,和履行其它操作。觸發器也能夠依據數據修正前後的表狀況,再行采用對策。一個表中的多個同類觸發器(INSERT、UPDATE 或 DELETE)許可采用多個分歧的對策以呼應統一個修正語句。
3 與此同時,固然觸發器功效壯大,輕松靠得住地完成很多龐雜的功效,為何又要慎用?過量觸發器會形成數據庫及運用法式的保護艱苦,同時對觸發器過火的依附,必將影響數據庫的構造,同時增長了保護的龐雜法式。
觸發器步調詳解
1 起首,我們來測驗考試創立一個觸發器,請求就是在AddTable這個表上創立一個Update觸發器,語句為:
create trigger mytrigger on AddTable
for update
2 然後就是sql語句的部門了,重要是假如產生update今後,請求觸發器觸發一個甚麼操作。這裡的意思就是假如湧現update了,觸發器就會觸發輸入:the table was updated!---By 小豬也無法。
3 接上去我們來將AddTable表中的數據履行一個更改的操作:
4 履行後,我們會發明,觸發器被觸發,輸入了我們設置好的文本:
5 那觸發器創立今後呢,它就正式開端任務了,這時候候我們須要更改觸發器的話,只須要將開端的create創立變成alter,然後修正邏輯便可:
6 假如我們想檢查某一個觸發器的內容,直接運轉:exec sp_helptext [觸發器名]
7 假如我想查詢以後數據庫中有若干觸發器,以便利我停止數據庫保護,只須要運轉:
select * from sysobjects where xtype='TR'
8 我們假如須要封閉或許開啟觸發器的話,只須要運轉:
disable trigger [觸發器名] on database --禁用觸發器
enable trigger [觸發器名] on database --開啟觸發器
9 那觸發器的功效雖年夜,然則一旦觸發,恢復起來就比擬費事了,那我們就須要對數據停止掩護,這裡就須要用到rollback數據回滾~
10 第九步的意思就是查詢AddTable表,假如外面存在TableName=newTable的,數據就回滾,觸發器中斷,那我們再停止一下測試,對AddTable表停止更改,發明,觸發update觸發器以後,由於稀有據掩護,觸發器中斷:
留意事項
禁用和開啟觸發器都須要必定的權限,假如權限不敷是沒法停止操作的。
留意運轉後的毛病提醒,關於改正毛病是很有贊助的。