当前位置:首页 > fate/go > 正文

sqlserver触发器for和after的区别?

2023-01-11 17:48:57  来源:网络   热度:

sqlserver触发器for和after的区别?

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 语句执行完了,数据写到表里面了以后,才触发。

FGO贞德alter需要哪些材料突破

FGO贞德alter需要哪些材料突破?FGO贞德alter作为5星average职阶,是玩家们特别喜欢的英灵之一。FGO贞德alter俗称黑贞德。那么贞德alter需要哪些材料突破?还不太清楚的玩家和小编一起来看看FGO贞德alter需要哪些材料突破 FGO贞德alter突破材料详细介绍的文章吧。

FGO贞德alter满破材料一览

一段灵基突破:100,000QP& 英雄之证明*10 虚影之尘*10

二段灵基突破:300,000QP& 八双连晶*10 无间齿轮*10

三段灵基突破:1,000,000QP& 凤凰羽毛*10 混沌之爪*10

四段灵基突破:3,000,000QP& 血泪之石*10 蛮神的心脏*10

一周热门