我想问下SQL 2005中的触发器的for,instead of,after3种触发器的区别~

知道的请告诉下~具体举个例子说明下遇到相应的语句~它是怎么执行的吧~谢谢了~说得好的马上加分!~... 知道的请告诉下~具体举个例子说明下遇到相应的语句~它是怎么执行的吧~谢谢了~说得好的马上加分!~ 展开
 我来答
wangzhiqing999
2011-05-22 · TA获得超过1.6万个赞
知道大有可为答主
回答量:7048
采纳率:100%
帮助的人:3374万
展开全部
FOR | AFTER
AFTER 指定触发器仅在触发 SQL 语句中指定的所有操作都已成功执行时才被触发。所有的引用级联操作和约束检查也必须在激发此触发器之前成功完成。
如果仅指定 FOR 关键字,则 AFTER 为默认值。
不能对视图定义 AFTER 触发器。

INSTEAD OF
指定执行 DML 触发器而不是触发 SQL 语句,因此,其优先级高于触发语句的操作。

如果仅指定 FOR 关键字,则 AFTER 为默认值。
也就是说, FOR = AFTER。

下面是一个触发器的例子:

-- 创建测试主表.
CREATE TABLE test_main (
id INT,
value VARCHAR(10),
PRIMARY KEY(id)
);

-- 创建测试子表.
CREATE TABLE test_sub (
id INT,
main_id INT,
value VARCHAR(10),
PRIMARY KEY(id)
);

-- 创建外键.
ALTER TABLE test_sub
ADD CONSTRAINT main_id_cons
FOREIGN KEY (main_id) REFERENCES test_main;

-- 创建 FOR 触发器.
CREATE TRIGGER InsertTest
ON test_sub
FOR INSERT
AS
BEGIN
PRINT('INSERT test_sub!');
END;
Go

INSERT INTO test_sub VALUES( 100,100,'100');
消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 FOREIGN KEY 约束"main_id_cons"冲突。该冲突发生于数据库"TestDev",表"dbo.test_main", column 'id'。
语句已终止。

从上面的结果可以看到,由于外键冲突,插入失败,导致触发器也没有被执行。

-- 修改为 AFTER 触发器.
ALTER TRIGGER InsertTest
ON test_sub
AFTER INSERT
......

INSERT INTO test_sub VALUES( 100,100,'100');
消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 FOREIGN KEY 约束"main_id_cons"冲突。该冲突发生于数据库"TestDev",表"dbo.test_main", column 'id'。
语句已终止。

可以看到,AFTER 运行结果与 FOR 一样。

-- 修改为 INSTEAD OF 触发器.
ALTER TRIGGER InsertTest
ON test_sub
INSTEAD OF INSERT
......

INSERT INTO test_sub VALUES( 100,100,'100');
INSERT test_sub!
(1 行受影响)

从上面的结果看到,触发器被执行了。
但是 test_sub 中并没有 100,100,'100' 的数据。
原因在于:
INSTEAD OF 指定执行 DML 触发器而不是触发 SQL 语句

也就是说 当你的触发器是 INSTEAD OF INSERT 的时候
你的 INSERT 语句,将直接执行这个触发器
而不是等你 INSERT 语句执行完了,数据写到表里面了以后,才触发。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式