1. 程式人生 > >初學sql server 2008之觸發器

初學sql server 2008之觸發器

  觸發器(trigger):是一種特殊的儲存過程,可以用來對錶實施複雜的完整性約束,保持資料的一致性。當觸發器所保護的資料發生改變時,觸發器會自動被啟用,並執行觸發器中所定義的相關操作,從而保證對資料的不完整性約束或不正確的修改

  在SQL SERVER 2008中,有三種類型的觸發器:

(1)DML觸發器:是指觸發器在資料庫中發生資料操作語言(DML)事件時將啟用。DML事件即指在表或檢視中修改資料的insert、update、delete語句也。

(2)DDL觸發器:是指當伺服器或資料庫中發生資料定義語言(DDL)事件時將啟用。DDL事件即指在表或索引中的create、alter、drop語句也。

(3)登陸觸發器:是指當用戶登入SQL SERVER例項建立會話時觸發。

  不過根據DML觸發器觸發的方式不同又分為以下兩種情況:

(1)AFTER觸發器:它是在執行INSERT、UPDATE、DELETE語句操作之後執行觸發器操作。它主要是用於記錄變更後的處理或檢查,一旦發生錯誤,可以用Rollback Transaction語句來回滾本次扣件,不過不能對檢視定義AFTER觸發器

(2)INSTEAD OF觸發器:它在執行INSERT、UPDATE、DELETE語句操作之前執行觸發器本身所定義的操作。而INSTEAD OF觸發器是可以定義在檢視上的

   在SQL SERVER 2008中,DML觸發器的實現使用兩個邏輯表DELETED和INSERTED。這兩個表是建立在資料庫伺服器的記憶體中,由系統管理的邏輯表,我們對於它只有只讀的許可權。DELETED和INSERED表的結構和觸發器所在的資料表的結構是一樣的。當觸發器執行完成後,它們也就會被自動刪除。

INSERED表用於存放你在操件insert、update、delete語句後,更新的記錄。比如你插入一條資料,那麼就會把這條記錄插入到INSERTED表。

DELETED表用於存放你在操作 insert、update、delete語句前,你建立觸發器表中資料庫。比如你原來的表中有三條資料,那麼他也有三條資料。

下面我們就開始建立觸發器吧!

觸發器定義的格式我就不打一遍,你開啟幫助裡有的事。

我們先建立一張如下的表吧!然後以它為例吧。

View Code
create table table1 
(
user_id int primary key identity(1,1), 
user_name
varchar(3) not null )

下面就是建立一個簡單的after觸發器:

create trigger trigMessageList 
on table1 
after insert,update 
as raiserror('資料一致性驗證',16,1)

此時如果我們手動開啟table1,輸入一條,根本就插入不了,我們只能寫一條如下的SQL語句插入一條資料

insert into table1(user_name)values('23')

結果資料是插入成功了,但是會出顯如下圖所示的提示:

下面我再建立一個稍微有點複雜的after觸發器:

複製程式碼
--該觸發器作用是:如果向table1中插入資料時,
--先檢查要向table1插入的這條的USER_ID是否USERS(我建立的另一個表)表中的USER_ID欄位中有,如果不存在則不允許插入create trigger trigInsertedMessages 
on table1 
after insert 
as 
if exists (select * from inserted a where a.user_id not in (select USER_ID from USERS)) 
begin 
raiserror('資料一致性驗證',16,1) 
rollback transaction 
end
複製程式碼

inserted of觸發器和after觸發器寫法差不多,在此就不多寫了。

下面建立一個簡單的DDL觸發器:

複製程式碼
--它的作用是:防止資料庫Test(我建立的一個實驗資料庫)中的任一表被修改或刪除create trigger trigDB 
on database 
for drop_table,alter_table 
as 
print '你一定要禁用觸發器“trigDB"才能刪除或修改這個資料庫的表' 
rollback
複製程式碼

刪除觸發器:

drop trigger trigDB 
ON DATABASE

一定要記得加上ON DATABASE這條,否則就刪除不了。
最後再來條開啟和禁用觸發器的語句:

disable trigger trigDB on database --禁用觸發器enable trigger trigDB on database --開啟觸發器