+ -
当前位置:首页 → 问答吧 → 关于MSSQL INSTEAD OF 触发器中断执行问题

关于MSSQL INSTEAD OF 触发器中断执行问题

时间:2011-11-07

来源:互联网

关于MSSQL INSTEAD OF 触发器中断执行问题..
请注意:不是回滚..回滚是全部取消..我需要有一个执行..其他取消..

INSTEAD OF 触发器 会在所要更新数据的操作之前执行..

我想问的是..我执行完"INSTEAD OF 触发器"
用什么方式来停止后续的操作.. 

-----------------------------
已知:Trigger tr_A ON tbl_A INSTEAD OF Insert
已知:Trigger tr_B ON tbl_A For Insert
执行:Insert into tbl_A

想法步骤:
1)Insert tbl_A 触发 tr_A
2)有某语句执行中断
3)Insert into tbl_A和tr_B不执行

求解
第二步需要怎么做

作者: solomon300   发布时间: 2011-11-07

那你直接不要第二个触发器不就行了。

作者: AcHerat   发布时间: 2011-11-07

引用 1 楼 acherat 的回复:

那你直接不要第二个触发器不就行了。


问题这里是有一个判断的..

重要的不是触发器 tr_b  
我要的是 insert tbl_A 不执行..而tr_A 要执行..

tr_A有更新其他表的操作

作者: solomon300   发布时间: 2011-11-07

第二步很简单,判断条件符合就插入,否则直接退出,大概

SQL code
create trigger Trigger tr_A ON tbl_A INSTEAD OF Insert
as
if exists (select 1 from inserted where col1 = 'a')
   return;

insert tbl_A select * from inserted

go




作者: NBDBA   发布时间: 2011-11-07

把这些判断全部放到insead of触发器里,判断什么的逻辑处理下,写成一个。

作者: AcHerat   发布时间: 2011-11-07

引用 3 楼 nbdba 的回复:

第二步很简单,判断条件符合就插入,否则直接退出,大概

SQL code
create trigger Trigger tr_A ON tbl_A INSTEAD OF Insert
as
if exists (select 1 from inserted where col1 = 'a')
return;

insert tbl_A select * from inserted

……


Return 不能中断后续执行吧..

我需要中断后续执行的.

作者: solomon300   发布时间: 2011-11-07

测试看看

SQL code
create table tbl_A (
id int IDENTITY(1,1)
,col1 varchar(100)
)
go


create Trigger tr_A ON tbl_A INSTEAD OF Insert
as
print 'tr_A'
if exists (select 1 from inserted where col1 = 'a')
   return;

insert tbl_A(col1) select col1 from inserted

go


create Trigger tr_B ON tbl_A after Insert
as

print 'tr_B'
go

--测试
insert tbl_A (col1) values('b')
--结果
tr_A
tr_B

(1 行受影响)

(1 行受影响)

insert tbl_A (col1) values('a')
--结果(没有执行tr_B)
tr_A

(1 行受影响)

作者: NBDBA   发布时间: 2011-11-07

引用 4 楼 acherat 的回复:

把这些判断全部放到insead of触发器里,判断什么的逻辑处理下,写成一个。


SQL code

create trigger Trigger tr_A 
ON tbl_A 
INSTEAD OF Insert 
as 
if exists (select 1 from inserted a inner join tbl_A b where a.col1 = b.col1)
begin
insert into tbl_B values('','')
--此处执行中断:一切后续操作都将停止
--但是insert tbl_B 必须执行
end

go

作者: solomon300   发布时间: 2011-11-07

引用 5 楼 solomon300 的回复:
引用 3 楼 nbdba 的回复:

第二步很简单,判断条件符合就插入,否则直接退出,大概

SQL code
create trigger Trigger tr_A ON tbl_A INSTEAD OF Insert
as
if exists (select 1 from inserted where col1 = 'a')
return;

insert tbl_A se……

是否执行测试下就知道,不要猜

作者: NBDBA   发布时间: 2011-11-07

引用 8 楼 nbdba 的回复:

引用 5 楼 solomon300 的回复:
引用 3 楼 nbdba 的回复:

第二步很简单,判断条件符合就插入,否则直接退出,大概

SQL code
create trigger Trigger tr_A ON tbl_A INSTEAD OF Insert
as
if exists (select 1 from inserted where col1 = 'a')
r……


好的..十分感谢..

作者: solomon300   发布时间: 2011-11-07

引用 7 楼 solomon300 的回复:
引用 4 楼 acherat 的回复:

把这些判断全部放到insead of触发器里,判断什么的逻辑处理下,写成一个。



SQL code

create trigger Trigger tr_A
ON tbl_A
INSTEAD OF Insert
as
if exists (select 1 from inserted a inner join tbl_A……


你的逻辑应该

SQL code
create trigger Trigger tr_A 
ON tbl_A 
INSTEAD OF Insert 
as 

insert into tbl_B values('','')
--但是insert tbl_B 必须执行


if exists (select 1 from inserted a inner join tbl_A b where a.col1 = b.col1)
begin
--此处执行中断:一切后续操作都将停止
  return
end

-- 正常情况下本身的事情需要做
insert tbl_A select * from inserted

go

作者: NBDBA   发布时间: 2011-11-07

我的最初逻辑是..只要insert 来实现 insert和update 同一个表的操作..

作者: solomon300   发布时间: 2011-11-07

但是好像有非常大的逻辑错误..

作者: solomon300   发布时间: 2011-11-07