麻烦大侠们给我一个详细一点的指导一下。如果单独一个事务我能了解
begin tran
begin try
xxx
commit tran
end try
begin catch
rollbakc
end catch
如果多个,还有触发器组合我该怎么处理触发器是事务吗?
怎么我写了一个下面的触发器create trigger tgr_t
on t
for inset
as
begin
xxxxxxxxxx
raiseeror('aaa',16,1,)
end但是我向t表插入数据时还是没有回滚。还有我如果在触发器里调用存储过程该怎么处理,存储过程里我都还敢用事务了,因为事务一嵌套我很不明白,怎么处理,
我现在都只是在里面要返回的地方rollback 这样可以中止,但我想这样可能不是正确的,如果,程序单独调用这个存储过程不是由触发器来调,那就会出问题吧
begin tran
begin try
xxx
commit tran
end try
begin catch
rollbakc
end catch
如果多个,还有触发器组合我该怎么处理触发器是事务吗?
怎么我写了一个下面的触发器create trigger tgr_t
on t
for inset
as
begin
xxxxxxxxxx
raiseeror('aaa',16,1,)
end但是我向t表插入数据时还是没有回滚。还有我如果在触发器里调用存储过程该怎么处理,存储过程里我都还敢用事务了,因为事务一嵌套我很不明白,怎么处理,
我现在都只是在里面要返回的地方rollback 这样可以中止,但我想这样可能不是正确的,如果,程序单独调用这个存储过程不是由触发器来调,那就会出问题吧
IF OBJECT_ID('PROC1') IS NOT NULL DROP PROCEDURE PROC1
GO
CREATE TABLE TB(COL1 INT)
GO
CREATE PROCEDURE PROC1(@COL1 INT)
AS
BEGIN
BEGIN TRAN
INSERT INTO TB SELECT @COL1
COMMIT TRAN
END
GOBEGIN TRAN
EXEC PROC1 1
ROLLBACK TRAN
SELECT COUNT(1) FROM TB
--0
create trigger trig_insert
on tt
for insert
as
declare @a varchar(20), @b varchar(20), @c varchar(20),@d varchar(20)
select @a=a,@b=b,@c=c from inserted
if exists (select 1 from #tt where a=@a and b=@b)
begin
select @d=c from #tt where a=@a and b=@b
if exists (select 1 from (select * from split(@c,'/')) a
left join (select * from split(@d,'/')) b on a.textstr=b.textstr where b.id is not null)
begin
print '有重复,插入失败!'
rollback tran return
end
else
print '插入成功!'
end
go--测试
-------------------------------------------------
insert into tt values('LL', 'ss0', '2/5/3')
-------------------------
有重复,插入失败!
消息 3609,级别 16,状态 1,第 1 行
事务在触发器中结束。批处理已中止。insert into tt values('LL', 'ss0', '2/9/3')
------------------------
插入成功!(1 行受影响)
CREATE TRIGGER delete_stuON studentFOR DELETEASDECLARE @rowcount intSELECT @rowcount =@@ROWCOUNTIF @rowcount > 1 BEGIN ROLLBACK TRANSANCTION RAISERROR( ' 你要删除的数据记录为%d条,一次只能删除一行数据,删除失败!' , 16 , 1 , @rowcount ) END
执行这条语句成功:DELETE student FROM student WHERE stuNo='120801'当执行这条语句时就会出错:DELETE student FROM student WHERE stuNo>'120811'
回复7楼:因为你删的是一个集合 要考虑用游标读取deleted表中的信息再进行删除
你看看下面就会报错了。
IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
IF OBJECT_ID('PROC1') IS NOT NULL DROP PROCEDURE PROC1
GO
CREATE TABLE TB(COL1 INT)
GO
CREATE PROCEDURE PROC1(@COL1 INT)
AS
BEGIN
BEGIN TRAN
INSERT INTO TB SELECT @COL1
if exists(select 1 from tb)
rollback tran
else
commit tran
END
GOBEGIN TRAN
insert into tb select 12
EXEC PROC1 1
--ROLLBACK TRAN
commit tran
SELECT COUNT(1) FROM TB