Ⅰ 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關鍵字:觸發器的執行是在數據的插入.更新或刪除之後執行的。