程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SqlServer觸發器詳解

SqlServer觸發器詳解

編輯:MSSQL

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觸發器以後,由於稀有據掩護,觸發器中斷:

留意事項

禁用和開啟觸發器都須要必定的權限,假如權限不敷是沒法停止操作的。

留意運轉後的毛病提醒,關於改正毛病是很有贊助的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved