觸發器(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 --開啟觸發器
新手學習,只為分享!
