当前位置:首页 » 编程语言 » sqlserver触发器回滚
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sqlserver触发器回滚

发布时间: 2023-02-13 14:02:07

sql SERVER中,看到一个触发器的最后有一句是: begin rollback tran end 那么它回滚到哪里去

触发当前触发器的事务(包含触发器中的操作)

全部回滚。

Ⅱ sql2005的update触发器中,回滚后老是报错

在触发器中无需提交获回滚,它应该属于调用它的事务,它的提交或回滚会导致这个事务的提交或回滚.当检查到约束不合法时不应该回滚,而应该抛出异常(sqlserver中好象用RAISERROR),异常会导致主事务回滚。

Ⅲ 触发器中执行回滚SQL SERVER2000,,,高分

如果 @@TRANCOUNT 的值在存储过程完成时与过程执行时不同,则会生成一个 266 信息类错误。该错误不是由触发器中同一个条件生成的。

当调用存储过程时,如果 @@TRANCOUNT 为 1 或更大,并且该过程执行 ROLLBACK TRANSACTION 或 ROLLBACK WORK 语句,则会产生 266 号错误。这是因为 ROLLBACK 回滚所有未完成的事务,并将 @@TRANCOUNT 减到 0,该值比调用过程时要小。

如果在触发器中发出 ROLLBACK TRANSACTION:

◆对当前事务中的那一点所做的所有数据修改都将回滚,包括触发器所做的修改。

◆触发器继续执行 ROLLBACK 语句之后的所有其余语句。如果这些语句中的任意语句修改数据,则不回滚这些修改。执行其余的语句不会激发嵌套触发器。

◆在批处理中,所有位于激发触发器的语句之后的语句都不被执行。

◆触发器中的 ROLLBACK 关闭并释放所有在包含激发触发器的语句的批处理中声明和打开的游标。这其中包括了在激发触发器的批处理所调用的存储过程中声明和打开的游标。在激发触发器的批处理之前的批处理中所声明的游标将只是关闭,但是在以下条件下,STATIC 或 INSENSITIVE 游标不关闭:

·CURSOR_CLOSE_ON_COMMIT 设置为OFF。

·静态游标要么是同步游标,要么是完全填充的异步游标。

当执行触发器时,触发器的操作总是好像有一个未完成的事务在起作用。如果激发触发器的语句是在隐性或显式事务中,则肯定会这样。在自动提交模式下,也是如此。当语句开始以自动提交模式执行时,如果遇到错误,则会有隐含的 BEGIN TRANSACTION 语句允许恢复该语句生成的所有修改。该隐含的事务对批处理中的其它语句没有影响,因为当语句完成时,该事务要么提交,要么回滚。但是,当调用触发器时,该隐含的事务将仍然有效。

这意味着,只要触发器中发出 BEGIN TRANSACTION 语句,则实际上就开始了一个嵌套事务。因为当回滚嵌套事务时,嵌套的 BEGIN TRANSACTION 语句将被忽略,触发器中发出的 ROLLBACK TRANSACTION 总是回滚过去该触发器本身发出的所有 BEGIN TRANSACTION 语句。ROLLBACK 回滚到最外部的 BEGIN TRANSACTION。

若要在触发器中进行部分回滚,则即使总是以自动提交模式进行调用,也必须使用 SAVE TRANSACTION 语句。以下的触发器阐明了这一点:

CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS
SAVE TRANSACTION MyName
INSERT INTO TestAudit
SELECT * FROM inserted
IF (@@error <> 0)
BEGIN
ROLLBACK TRANSACTION MyName
END

这也影响触发器中 BEGIN TRANSACTION 语句后面的COMMIT TRANSACTION 语句。因为 BEGIN TRANSACTION 启动一个嵌套事务,而随后的 COMMIT 语句只应用于该嵌套事务。如果在 COMMIT 之后执行 ROLLBACK TRANSACTION 语句,那么 ROLLBACK 将一直回滚到最外部的 BEGIN TRANSACTION。以下的触发器阐明了这一点:

CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS
BEGIN TRANSACTION
INSERT INTO TrigTarget
SELECT * FROM inserted
COMMIT TRANSACTION
ROLLBACK TRANSACTION

此触发器绝对不会在 TrigTarget 表中插入。BEGIN TRANSACTION 总是启动一个嵌套事务。COMMIT TRANSACTION 只提交嵌套事务,而下面的 ROLLBACK TRANSACTION 则一直回滚到最外部的 BEGIN TRANSACTION。

Ⅳ SQL 触发器中事物回滚什么意思

当事物里面的执行语句发生错误或者异常时Rollback,撤销错误前执行的操作。

Ⅳ 触发器的回滚操作是什么意思

就是取消之前的操作

Ⅵ SQL插入或更新记录不合规范时触发器回滚,SQL基本语句请教!

直接自制过去:

---建表
create table c(cid int primary key,region char(2))
create table a(id int primary key,cid int references c(cid),region char(2))
go
---触发器
create trigger 信息完善 on a
for insert,update
as
begin
declare @a int
set @a=(select c.cid from c join (select * from inserted) as b on c.region=b.region)
if @a is null
begin
print 'error!'
rollback
end
else
---注意update一定要加上where子句,不然所有行的cid字段都会变成同一个值
update a set cid=@a where id=(select id from inserted)
end
go
---向c表插入数据
insert into c values(001,'a')
insert into c values(002,'b')
insert into c values(003,'c')
insert into c values(004,'d')
-----向a表插入正确的数据
insert into a(id,region) values(1,'c')
insert into a(id,region) values(2,'d')
select * from a
-----向a表插入不正确的数据
insert into a(id,region) values(3,'e')
insert into a(id,region) values(4,'f')

Ⅶ sqlserver 触发器的运行是在update等处理的前还是后

触发器执行顺序根据 before 和 after 关键字决定。

使用before 关键字:触发器的执行是在数据的插入.更新或删除之前执行的。
使用after关键字:触发器的执行是在数据的插入.更新或删除之后执行的。