sql server update触发器_SQL Server 触发器
T-SQL 觸發(fā)器
觸發(fā)器分為
BEFORE觸發(fā)器*(SQL Server不支持,Oracle支持)在事件發(fā)生時(shí)觸發(fā)。
AFTER觸發(fā)器是 SQLServer生成的最初用于自動(dòng)相應(yīng)數(shù)據(jù)修改的機(jī)制。在 SQLServer200以前的版本中 AFTER觸發(fā)器是唯一的觸發(fā)器,因此不用指明 AFTER,也可以用 FOR代替,該種觸發(fā)器的行為是在事件之后執(zhí)行。
SQLServer2000中新增了 INSTEAD OF觸發(fā)器,該觸發(fā)器執(zhí)行某項(xiàng)操作,而不是觸發(fā)這個(gè)觸發(fā)器的操作。
AFTER觸發(fā)器
AFTER觸發(fā)器是默認(rèn)的觸發(fā)器類型,因此關(guān)鍵字AFTER可以選。
CREATE TRIGGER trigger_name
ON table_name
AFTER {INSERT | UPDATE | DELETE }
AS
BEGIN
-- SQL statement
END
GO
案例
??在pubs數(shù)據(jù)庫中生成一個(gè)觸發(fā)器,打印一條消息,表示UPDATE Commands語句更新的數(shù)據(jù)行數(shù)。
USE pubs; -- 選擇pubs數(shù)據(jù)庫。
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
-- 執(zhí)行一條語句,查看觸發(fā)器是否生效。
UPDATE dbo.commands
SET title=title
WHERE ID = 4;
GO
INSERTED表和DELETED表
在大多數(shù)觸發(fā)器情況下,需要知道數(shù)據(jù)修改中發(fā)生了什么變化,可以在INSERTED和DELETED表中找到這個(gè)信息。
案例:
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
| INSERT | 增加的行 | 空 |
| UPDATE | 新行 | 舊行 |
| DELETE | 空 | 刪除的行 |
檢查列更新
INSERT或者UPDATE觸發(fā)器內(nèi)可以使用UPDATE()函數(shù)。
使用UPDATE()函數(shù)檢查INSERT與UPDATE操作對數(shù)據(jù)列的影響。
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
執(zhí)行
-[ ] 執(zhí)行AFTER觸發(fā)器之前發(fā)生的事件。
限制處理 -- 包括檢查限制,唯一限制和主鍵限制。
聲明式引用 -- 這些操作是外部鍵限制定義的,保證表間的正確關(guān)系。
觸發(fā)操作 -- 即觸發(fā)觸發(fā)器的數(shù)據(jù)修改操作。這項(xiàng)操作發(fā)生在觸發(fā)器執(zhí)行之前,但結(jié)果要等到完成觸發(fā)器操作之后才提交到數(shù)據(jù)庫。
觸發(fā)順序
可以有多個(gè)對應(yīng)于INSERT,UPDATE,DELETE的觸發(fā)器,SQL Server可以指定第一個(gè)和最后一個(gè)觸發(fā)器,但中間的觸發(fā)器順序則無法確定。
觸發(fā)順序
SP_SETTRIGGERORDER過程是設(shè)置觸發(fā)器順序的工具。
格式:
SP_SETTRIGGERORDER trigger_name, 順序,'操作'./*其中,順序?yàn)閇First | Last | None] 操作為[Insert | Update | Delete]*/例如:
- SP_SETTRIGGERORDER tr_cmd_upd, FIRST, 'UPDATE';
建議盡量不要對同一個(gè)表的同一事件定義多個(gè)觸發(fā)器,可以把相關(guān)的操作定義到一個(gè)觸發(fā)器中。
特殊考慮
AFTER觸發(fā)器可以用于具有級聯(lián)參照完整性限制的表格中。
WRITETEXT與TRUNCATE TABLE不觸發(fā)觸發(fā)器。
觸發(fā)器是對象,因此要在數(shù)據(jù)庫中有唯一的名稱。
AFTER觸發(fā)器的限制
AFTER觸發(fā)器只能用于表,不能用于視圖。
一個(gè)AFTER觸發(fā)器不能用在多個(gè)表上。
TEXT, NTEXT與IMAGE列不能引用AFTER觸發(fā)器。
INSTEAD OF 觸發(fā)器
?SQL Server 2000引入新的Instead of 觸發(fā)器。
Instead of 的含義:該觸發(fā)器執(zhí)行某項(xiàng)操作,而不是觸發(fā)這個(gè)觸發(fā)器的操作。
什么時(shí)候使用Instead of觸發(fā)器。
3.1. 數(shù)據(jù)庫里的數(shù)據(jù)禁止修改。
3.2. 有可能要回滾修改的SQL語句。
3.3. 在視圖中使用的觸發(fā)器,AFTER觸發(fā)器不能在視圖中使用。
3.4. 控制數(shù)據(jù)的修改方式和流程。
總結(jié)
以上是生活随笔為你收集整理的sql server update触发器_SQL Server 触发器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无人驾驶技术(1)
- 下一篇: window上安装mysql服务核心版(