觸發器自動啟用事務,這個事務的取消會造成整個語句執行的失敗
在自己的機器上試了一下.我的環境是:
WINDOWS SERVER2003 SP1 + SQLSERVER2000 SP4 + ACCESS2003
觸發器很簡單,只有一行:
create trigger trg_update on testtb
for update
as
insert into openrowset('Microsoft.Jet.OLEDB.4.0', 'd:\test.mdb';'admin';'',table1)(id) select id from testtb
go
更新表testtb時報錯:
請求的操作未能執行,因為 OLE DB 提供程序 'Microsoft.Jet.OLEDB.4.0' 不支持所需的事務接口。
OLE DB 錯誤跟蹤[OLE/DB Provider 'Microsoft.Jet.OLEDB.4.0' IUnknown:
ueryInterface returned 0x80004002]。
-------------------------------------------------------------------------------------
如果在insert into openrowset(...)之前加上commit則成功,例如:
alter trigger trg_update on testtb
for update
as
begin transaction /*啟用嵌套事務*/
... /*嵌套事務內操作*/
commit /*提交嵌套事務*/
commit /*提交觸發器本身的隱性事務(即最外層事務)*/
insert into openrowset('Microsoft.Jet.OLEDB.4.0', 'd:\test.mdb';'admin';'',table1)(id) select id from testtb
go
這樣做的實質是觸發器中必須顯示地使用commit提交觸發器本身的隱性事務.缺點是向ACCESS插入行的操作不在事務的控制范圍內,如果向
ACCESS插入行的操作失敗,那么觸發器中所有的操作均無法被回滾,因為commit已經結束了觸發器的事務,操作已經被保存了.這樣的觸發器實際上只
是做到了實時性,卻無法保證SQLSERVER與ACCESS之間的數據一致性.
posted on 2008-02-28 19:46
一凡 閱讀(658)
評論(3) 編輯 收藏 所屬分類:
DATABASE