初學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 Codecreate table table1 ( user_id int primary key identity(1,1), user_namevarchar(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 --開啟觸發器