触发器自动启用事务,这个事务的取消会造成整个语句执行的失败
在自己的机器上试了一下.我的环境是:
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
一凡 阅读(649)
评论(3) 编辑 收藏 所属分类:
DATABASE