觸發(fā)器自動啟用事務(wù),這個事務(wù)的取消會造成整個語句執(zhí)行的失敗
在自己的機(jī)器上試了一下.我的環(huán)境是:
WINDOWS SERVER2003 SP1 + SQLSERVER2000 SP4 + ACCESS2003
觸發(fā)器很簡單,只有一行:
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時報錯:
請求的操作未能執(zhí)行,因為 OLE DB 提供程序 'Microsoft.Jet.OLEDB.4.0' 不支持所需的事務(wù)接口。
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 /*啟用嵌套事務(wù)*/
... /*嵌套事務(wù)內(nèi)操作*/
commit /*提交嵌套事務(wù)*/
commit /*提交觸發(fā)器本身的隱性事務(wù)(即最外層事務(wù))*/
insert into openrowset('Microsoft.Jet.OLEDB.4.0', 'd:\test.mdb';'admin';'',table1)(id) select id from testtb
go
這樣做的實質(zhì)是觸發(fā)器中必須顯示地使用commit提交觸發(fā)器本身的隱性事務(wù).缺點(diǎn)是向ACCESS插入行的操作不在事務(wù)的控制范圍內(nèi),如果向
ACCESS插入行的操作失敗,那么觸發(fā)器中所有的操作均無法被回滾,因為commit已經(jīng)結(jié)束了觸發(fā)器的事務(wù),操作已經(jīng)被保存了.這樣的觸發(fā)器實際上只
是做到了實時性,卻無法保證SQLSERVER與ACCESS之間的數(shù)據(jù)一致性.
posted on 2008-02-28 19:46
一凡 閱讀(657)
評論(3) 編輯 收藏 所屬分類:
DATABASE