T-SQL 觸發器
觸發器分為
BEFORE觸發器*(SQL Server不支持,Oracle支持)在事件發生時觸發。
AFTER觸發器是 SQLServer
生成的最初用于自動相應數據修改的機制。在 SQLServer200
以前的版本中 AFTER
觸發器是唯一的觸發器,因此不用指明 AFTER
,也可以用 FOR
代替,該種觸發器的行為是在事件之后執行。
SQLServer2000
中新增了 INSTEAD OF觸發器
,該觸發器執行某項操作,而不是觸發這個觸發器的操作。
AFTER觸發器
AFTER觸發器是默認的觸發器類型,因此關鍵字AFTER可以選。
CREATE TRIGGER trigger_name
ON table_name
AFTER {INSERT | UPDATE | DELETE }
AS
BEGIN
-- SQL statement
END
GO
案例
??在pubs數據庫中生成一個觸發器,打印一條消息,表示UPDATE Commands語句更新的數據行數。
USE pubs; -- 選擇pubs數據庫。
GO
CREATE TRIGGER tr_cmd_upd ON dbo.Commands
AFTER UPDATE
AS
BEGIN
PRINT 'Trigger Output '+CONVERT(VARCHAR(5),@@ROWCOUNT)+' rows were updated.';
END
GO
-- 執行一條語句,查看觸發器是否生效。
UPDATE dbo.commands
SET title=title
WHERE ID = 4;
GO
INSERTED表和DELETED表
在大多數觸發器情況下,需要知道數據修改中發生了什么變化,可以在INSERTED和DELETED表中找到這個信息。
案例:
SELECT * INTO commands_copy FROM commands;
GO
CREATE TRIGGER tr_cc ON dbo.commands_copy
FOR INSERT, UPDATE, DELETE
AS
BEGIN
PRINT 'Inserted:';
SELECT ID, Type, Platform FROM INSERTED;
PRINT 'Deleted:';
SELECT ID, Type, Platform FROM DELETED;
END
語句 | INSERTED的內容 | DELETED內容 |
---|---|---|
INSERT | 增加的行 | 空 |
UPDATE | 新行 | 舊行 |
DELETE | 空 | 刪除的行 |
檢查列更新
INSERT或者UPDATE觸發器內可以使用UPDATE()函數。
使用UPDATE()函數檢查INSERT與UPDATE操作對數據列的影響。
CREATE TRIGGER tr_ins_upd ON dbo.commands_copy
FOR INSERT, UPDATE
AS
BEGIN
IF(UPDATE(ID))
BEGIN
RAISERROR('You can not change the ID.', 15, 1);
END
END
執行
-[ ] 執行AFTER觸發器之前發生的事件。
限制處理 -- 包括檢查限制,唯一限制和主鍵限制。
聲明式引用 -- 這些操作是外部鍵限制定義的,保證表間的正確關系。
觸發操作 -- 即觸發觸發器的數據修改操作。這項操作發生在觸發器執行之前,但結果要等到完成觸發器操作之后才提交到數據庫。
觸發順序
可以有多個對應于INSERT,UPDATE,DELETE的觸發器,SQL Server可以指定第一個和最后一個觸發器,但中間的觸發器順序則無法確定。
觸發順序
SP_SETTRIGGERORDER過程是設置觸發器順序的工具。
格式:
SP_SETTRIGGERORDER trigger_name, 順序,'操作'./*其中,順序為[First | Last | None] 操作為[Insert | Update | Delete]*/
例如:
SP_SETTRIGGERORDER tr_cmd_upd, FIRST, 'UPDATE';
建議盡量不要對同一個表的同一事件定義多個觸發器,可以把相關的操作定義到一個觸發器中。
特殊考慮
AFTER觸發器可以用于具有級聯參照完整性限制的表格中。
WRITETEXT與TRUNCATE TABLE不觸發觸發器。
觸發器是對象,因此要在數據庫中有唯一的名稱。
AFTER觸發器的限制
AFTER觸發器只能用于表,不能用于視圖。
一個AFTER觸發器不能用在多個表上。
TEXT, NTEXT與IMAGE列不能引用AFTER觸發器。
INSTEAD OF 觸發器
?SQL Server 2000引入新的Instead of 觸發器。
Instead of 的含義:該觸發器執行某項操作,而不是觸發這個觸發器的操作。
什么時候使用Instead of觸發器。
3.1. 數據庫里的數據禁止修改。
3.2. 有可能要回滾修改的SQL語句。
3.3. 在視圖中使用的觸發器,AFTER觸發器不能在視圖中使用。
3.4. 控制數據的修改方式和流程。