【问题标题】:SQL Server Trigger using inserted ID使用插入 ID 的 SQL Server 触发器
【发布时间】:2013-05-22 00:14:32
【问题描述】:

我想针对在我的数据库中插入一个表创建一个触发器。例如,如果我有一个company_name 表,我想执行以下操作:

  1. 在服务器 A 上的 company_name 表中插入新行
  2. 调用触发器以获取服务器 A 上 company_name 中新插入的行的 ID。
  3. Set identity_insert ON 在服务器 B 中的 company_name 表上
  4. 将刚刚插入服务器 A 的同一行插入服务器 B 上的 company_name 表中。

链接服务器可以参考[ServerB].[ServerB-Database].dbo.company_name

由于不同国家/地区的客户的数据托管限制,这是一项要求。

【问题讨论】:

  • 那么您对此有何疑问?
  • 我将如何编写此触发器来执行此操作?
  • id 是 guid,如果不是,您将如何避免服务器 a 中的 id 与 B 中的 id 冲突?如果 serverB 不可用,你想做什么,在 server a 中插入失败?我看到了问题。
  • 您不要在触发器中使用Scope_Identity()(除非它正在执行insert),而是使用inserted 伪表。并且请编写触发器来处理多行,或者如果它无法处理它们,请使用RaIsError 显式失败。
  • 您最好寻找替代方法来执行此操作,例如 Service Broker。在触发器中调用跨服务器/跨国分布式事务会导致各种不愉快。

标签: sql sql-server triggers identity-insert


【解决方案1】:

一个问题是A国和B国之间的滞后和联系。

当远程插入发生时,本地事务仍在运行。这会降低性能并增加阻塞。

远程服务器也可能不可用。或者反应时间过长。您可以将触发器编码为不会失败,但您的数据不一致。

最后,如果远程服务器上有插入,则说明存在多主机问题。

我真的会考虑像复制这样的解决方案,将数据发布到另一台服务器。 或者考虑使用服务代理来解耦本地和远程插入。

【讨论】:

  • 感谢您的回答。我想我会采用不同的方法。
猜你喜欢
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多