免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3243 | 回复: 4
打印 上一主题 下一主题

在触发器中对链接服务器表进行DML操作出错的问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-22 18:17 |只看该作者 |倒序浏览
在存储过程中访问链接服务器(access数据库)中的表并进行insert操作没有问题,但触发器中则提示“因为链接服务器 \"(null)\" 的 OLE DB 访问接口 \"Microsoft.jet.OLEDB.4.0\" 不支持所需的事务接口。”。有无解决办法?

论坛徽章:
0
2 [报告]
发表于 2007-10-22 19:55 |只看该作者
触发器自动启用事务,这个事务的取消会造成整个语句执行的失败  

在自己的机器上试了一下.我的环境是:   
  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之间的数据一致性.

论坛徽章:
0
3 [报告]
发表于 2007-10-23 11:08 |只看该作者
谢谢,这样做确实可以实现,我用的是sqlserver2005+access2003。多请教一下,如果用odbc访问access会不会有同样的问题?用openrowset函数通过odbc访问access具体格式能举个例子吗?

论坛徽章:
0
4 [报告]
发表于 2007-10-30 17:55 |只看该作者
有个新的问题,想请教下如何能够避免系统提示该事物已提交的错误?在应用程序使用这个触发器的时候每次都有个错误的对话框弹出

论坛徽章:
0
5 [报告]
发表于 2007-10-31 13:20 |只看该作者
alter trigger trg_update on yourtablename
for update
as
begin transaction
insert into openrowset(\'Microsoft.Jet.OLEDB.4.0\',\'d:\\test.mdb\';\'admin\';\'\',table1)(id) select id from test
commit transaction
commit
这样写不行吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP