sql触发器for和after的区别(sql语句的触发器问题,instead of、after、for事件的区别,还有execute as字句的使用谢谢)
本文目录
- sql语句的触发器问题,instead of、after、for事件的区别,还有execute as字句的使用谢谢
- for|after|instead of分别在什么情况下用啊
- 我想问下**L 2005中的触发器的for,instead of,after3种触发器的区别~
- sql语句中,触发器中for 和 after 的区别是什么
- sql server 触发器 中 for 怎么使用
- 关于MS**L中触发器的问题
sql语句的触发器问题,instead of、after、for事件的区别,还有execute as字句的使用谢谢
after等价于for,是事后触发。instead of则会取代原来的操作,例如在你的例子里,将不再执行插入操作,而是执行触发器里的操作。
execute as是用来定义模块的执行上下文
EXECUTE AS { CALLER | SELF | OWNER | ’user_name’ }
其中CALLER指模块调用方,SELF指创建或更改模块的用户,OWNER指模块的当前所有者, ‘user_name’ 则是指定的用户。
for|after|instead of分别在什么情况下用啊
FOR / AFTER 是一个:
完整写FOR AFTER,只不过 AFTER 可写可不写,一般省略掉了。
在用户执行数据操作之后,触发器触发,执行触发器代码。
不可以定义在视图上。
例如:
表1 (ID,NAME)
表2 (ID,NAME)
当用户插入表1数据后,表2也**入相同的数据
CREATE TRIGGER TRI1
ON 表1
FOR INSERT
AS
INSERT INTO 表2 SELECT * FROM INSERTED
INSTEAD OF:在用户执行数据操作数据之前,触发器触发,执行触发器代码,不执行用户的操作
根据这个特性,INSTEAD OF 触发器可以为视图添加数据操作的功能。
例如:
表1 (ID,NAME)
表2 (ID,DATE)
视图: VIEW_ALL(表****,表*****,表*****)
为 VIEW_ALL 视图添加INSERT操作
CREATE TRIGGER TRI2
ON VIEW_ALL
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO 表1 SELECT ID,NAME FROM INSERTED
INSERT INTO 表2 SELECT ID,DATE FROM INSERTED
END
更多详细资料可以看:
***隐藏网址***
FOR | AFTER
AFTER 指定触发器仅在触发 **L 语句中指定的所有操作都已成功执行时才被触发。所有的引用级联操作和约束检查也必须在激发此触发器之前成功完成。
如果仅指定 FOR 关键字,则 AFTER 为默认值。
不能对视图定义 AFTER 触发器。
INSTEAD OF
指定执行 DML 触发器而不是触发 **L 语句,因此,其优先级高于触发语句的操作。不能为 DDL 或登录触发器指定 INSTEAD OF。
对于表或视图,每个 INSERT、UPDATE 或 DELETE 语句最多可定义一个 INSTEAD OF 触发器。但是,可以为具有自己的 INSTEAD OF 触发器的多个视图定义视图。
我想问下**L 2005中的触发器的for,instead of,after3种触发器的区别~
FOR | AFTER
AFTER 指定触发器仅在触发 **L 语句中指定的所有操作都已成功执行时才被触发。所有的引用级联操作和约束检查也必须在激发此触发器之前成功完成。
如果仅指定 FOR 关键字,则 AFTER 为默认值。
不能对视图定义 AFTER 触发器。
INSTEAD OF
指定执行 DML 触发器而不是触发 **L 语句,因此,其优先级高于触发语句的操作。
如果仅指定 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_c***
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_c***"冲突。该冲突发生于数据库"TestDev",表"*****_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_c***"冲突。该冲突发生于数据库"TestDev",表"*****_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 触发器而不是触发 **L 语句
也就是说 当你的触发器是 INSTEAD OF INSERT 的时候
你的 INSERT 语句,将直接执行这个触发器
而不是等你 INSERT 语句执行完了,数据写到表里面了以后,才触发。
sql语句中,触发器中for 和 after 的区别是什么
两个没区别都是在update,insert ,delete 之后触发操作!
inserted of 属于前触发性,在update,insert ,delete 之前操作
sql server 触发器 中 for 怎么使用
创建触发器的语法是:
create trigger 触发器名称 on(为哪个表创建触发器) for (创建什么样的触发器)
只要记住,for后面跟触发器的类型就行了。
触发器主要分2种,DML和*****和instead of 都是DML触发器,其中,after主要是对表进行增、删、改时触发,而instead of 触发器并不执行其所定义的操作,只执行触发器本身。
关于MS**L中触发器的问题
你理解都错了, FOR与 AFTER 属于后触发器 也就是执行完成后在执行触发器,
DBMS会把你之前对表的操作与触发器执行的语句看成一个事务来执行,你建的触发器是个回滚的操作,当然会恢复你delete 的操作
---------------
当然有前触发器 ,instead of 的 就 属于 前触发器,具体怎么定义的建议你去找找相关资料,我这里一下也说不清楚!
更多文章:
firefox清除缓存(请教问题:火狐浏览器清空缓存的快捷键是什么)
2026年5月2日 18:40
matlab解符号方程组的例子(matlab 求助 解方程组)
2026年5月2日 18:00
网络编程实用教程答案(吉林大学网络学院本学期(Java网络编程大作业)有知道答案的吗)
2026年5月2日 17:00
wampserver橙色如何变成绿色(wampserver 64 为什么总显示橙色)
2026年5月2日 16:40







