【问题标题】:Calling linked server from trigger从触发器调用链接服务器
【发布时间】:2016-09-09 22:36:56
【问题描述】:

我在服务器 A 中创建了instead of trigger,我在其中调用了一个过程,该过程又调用了链接服务器(服务器 B)中的其他过程。

触发器(A)->过程(A)->过程(B)

但是,当触发器执行时,它会抛出以下错误:

链接服务器“xxx”的 OLE DB 提供程序“SQLNCLI11”返回消息“合作伙伴事务管理器已禁用其对远程/网络事务的支持。”。 消息 7391,第 16 层,状态 2,第 1 行 无法执行该操作,因为链接服务器“xxx”的 OLE DB 提供程序“SQLNCLI11”无法开始分布式事务。

当我这样做时:程序 (A) -> 程序 (B) 它运行良好。可能是什么原因?

我该如何解决这个问题?分布式查询与链接服务器查询不同吗?

【问题讨论】:

  • 两台机器上都配置了 MSDTC 吗?
  • @M.Ali,但是如果没有配置,调用 Procedure(Server A) -> Procedure(Server B) 会起作用吗?因为它有效

标签: sql-server stored-procedures triggers sql-server-2008-r2


【解决方案1】:

如果您在触发器中使用链接服务器,则需要使用 DTC(不推荐,因为它性能不佳,并且如果存在任何连接问题,您的事务将被中止)

您的过程 (A) 可能会填充一些队列表,然后一些计划任务可能会读取该队列表并运行过程 B。

使用 Replication 或 CDC(更改数据捕获)+ 计划任务来触发远程服务器上的过程 B

使用本地服务代理

【讨论】:

  • 谢谢。 2 和 3 将不起作用,因为我必须立即执行此操作并且作业按计划进行,并且 proc A 和 B 都应该接受参数。如何使用第 1 步和第 4 步?找不到示例。而且,为什么会出现这个问题,我们已经链接了服务器,如果不配置其他一些设置,它不应该工作吗?幕后是什么?
  • Sher,即设计使然:“包装在触发器中的分布式查询,即使没有明确指定事务,也被视为分布式事务。” support.microsoft.com/en-us/kb/274348
  • (2):从技术上讲,您可以在触发器中启动作业,因此无需安排它,但您必须检查作业是否已经在运行(例如,由先前的插入启动)并实施一些作业完成时处理剩余记录(如果有)的逻辑。
  • (3):使用事务复制,当复制代理连续运行时,更改通常会在几秒钟(或几毫秒)内交付。您可以在订阅者上创建一个更新/插入触发器来执行您的任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
相关资源
最近更新 更多