sql触发器for和after的区别(sql语句的触发器问题,instead of、after、for事件的区别,还有execute as字句的使用谢谢)

本文目录
- sql语句的触发器问题,instead of、after、for事件的区别,还有execute as字句的使用谢谢
- 关于MSSQL中触发器的问题
- sql server 触发器 中 for 怎么使用
- sql语句中,触发器中for 和 after 的区别是什么
- 我想问下SQL 2005中的触发器的for,instead of,after3种触发器的区别~
- for|after|instead of分别在什么情况下用啊
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’ 则是指定的用户。
关于MSSQL中触发器的问题
你理解都错了, FOR与 AFTER 属于后触发器 也就是执行完成后在执行触发器,
DBMS会把你之前对表的操作与触发器执行的语句看成一个事务来执行,你建的触发器是个回滚的操作,当然会恢复你delete 的操作
---------------
当然有前触发器 ,instead of 的 就 属于 前触发器,具体怎么定义的建议你去找找相关资料,我这里一下也说不清楚!
sql server 触发器 中 for 怎么使用
创建触发器的语法是:
create trigger 触发器名称 on(为哪个表创建触发器) for (创建什么样的触发器)
只要记住,for后面跟触发器的类型就行了。
触发器主要分2种,DML和DDL。after和instead of 都是DML触发器,其中,after主要是对表进行增、删、改时触发,而instead of 触发器并不执行其所定义的操作,只执行触发器本身。
sql语句中,触发器中for 和 after 的区别是什么
两个没区别都是在update,insert ,delete 之后触发操作!
inserted of 属于前触发性,在update,insert ,delete 之前操作
我想问下SQL 2005中的触发器的for,instead of,after3种触发器的区别~
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 语句执行完了,数据写到表里面了以后,才触发。
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(表1.ID,表1.NAME,表2.DATE)
为 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 指定触发器仅在触发 SQL 语句中指定的所有操作都已成功执行时才被触发。所有的引用级联操作和约束检查也必须在激发此触发器之前成功完成。
如果仅指定 FOR 关键字,则 AFTER 为默认值。
不能对视图定义 AFTER 触发器。
INSTEAD OF
指定执行 DML 触发器而不是触发 SQL 语句,因此,其优先级高于触发语句的操作。不能为 DDL 或登录触发器指定 INSTEAD OF。
对于表或视图,每个 INSERT、UPDATE 或 DELETE 语句最多可定义一个 INSTEAD OF 触发器。但是,可以为具有自己的 INSTEAD OF 触发器的多个视图定义视图。

更多文章:
在from子句中可以出现(如何在from 子句中嵌套查询下面的语句在access中出错!)
2026年10月11日 05:20
countif函数统计个数怎么用(countif函数怎么用 详解Excel中countif函数的使用方法)
2026年10月11日 03:30
正则匹配数字之前的字符(正则表达式如何匹配前面是数字、中间是“/”、后面也是数字,就像2/3专业的模式)
2026年10月11日 03:00
orlnsertbootmediinselected(我电脑开机显示这个是什么意思or insert boot media in select)
2026年10月10日 23:00
display的用法(display是什么意思 详解display的含义和用法)
2026年10月10日 22:00
html全部居中代码(怎么让网页居中显示,html如何让网页居中)
2026年10月10日 21:10




