随笔-196  评论-90  文章-8  trackbacks-0
触发器自动启用事务,这个事务的取消会造成整个语句执行的失败

在自己的机器上试了一下.我的环境是:
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 一凡 阅读(560) 评论(3)  编辑  收藏 所属分类: DATABASE

评论:
# re: sqlserver触发oracle问题... 2008-03-11 17:52 | king81118@126.com
只是在insert into openrowset('Microsoft.Jet.OLEDB.4.0', 'd:\test.mdb';'admin';'',table1)(id) select id from testtb
go
前家个commit 就可以了吗??
  回复  更多评论
  
# re: sqlserver触发oracle问题... 2008-03-19 14:40 | 一凡
不是在go前,而是在insert前  回复  更多评论
  
# re: sqlserver触发oracle问题...[未登录] 2009-07-17 17:56 | hh
哥们,标题是“sqlserver触发oracle问题...”怎么没有oracle而是access?????????????????????????????????????????????????  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: