如何正确触发对链接sql服务器的插入?

Adi*_*cov 2 sql sql-server triggers linked-server sql-server-2008

我在两个不同的sql服务器(一个是SqlServer 2000,另一个是2008)中有相同的表。

我正在使用 sql server Management Studio。

我希望每次在 SqlServer 2000 表(Table_1)中的表上进行插入时,都会发生触发器,并且记录也会被插入到 SqlServer 2008 表(也是 Table_1)中的同一个表中。

sql server 2008 被定义为链接服务器,可以使用 sql server management studio 从 2000 db 连接运行查询并在 2008 db 上执行插入。

触发器定义如下:

ALTER TRIGGER [dbo].[trgrTable] 
   ON  [dbo].[Table_1]
   AFTER INSERT
AS 
BEGIN

 INSERT INTO [TLVSQL].[AVI_DEV].[dbo].[Table_1](ID, Value)
      SELECT INSERTED.ID AS ID, INSERTED.Value AS Value
      FROM INSERTED

END
Run Code Online (Sandbox Code Playgroud)

[TLVSQL].[AVI_DEV]是 2008 年的数据库名称。

但是每次我在 2000 表上执行插入时,我都会收到一条消息,指出插入由于“sqloledb 无法启动分布式事务链接服务器...”而无法提交。

链接服务器的安全委托已明确定义,我将安全凭证显式设置为 db_owner 的用户/密码。

我究竟做错了什么 ?还有另一种方法可以完成我的要求吗?

谢谢。

Ale*_*kii 5

从触发器执行插入到链接服务器上的表中 - 错误的决定。这将对源表([dbo].[Table_1])中的插入性能产生很大影响,并且还有分布式事务,并且配置服务器以支持分布式事务 - 噩梦。

一种可能的解决方案是:

  1. 在源服务器上,您可以创建同步队列表。例如:

    CREATE TABLE dbo.SyncQueue
    (
        QueueId INT IDENTITY(1,1),        
        KeyForSync INT, -- Primary key value of record in dbo.SourceTable
        SyncStatus INT  -- statuses can be: 0 - New, 1 - Synchronized, 2 - Error
    )
    
    suppose you source table is
    
    CREATE TABLE dbo.SourceTable
    (
            Key INT, -- primary key of the table
            Data varchar(xxx)
    )
    
    Run Code Online (Sandbox Code Playgroud)
  2. dbo.SourceTable 上的 Triger 可以快速插入到 dbo.SyncQueue 记录需要同步的 Key

  3. 然后,一些定期执行的存储过程可以将队列中的记录插入链接服务器上的表中。

  • 那么是的,就您的情况而言,您的解决方案更好。如果 SQL Server 的版本 > 2008,您还可以使用 **“Change data capture”** 功能 (https://www.simple-talk.com/sql/learn-sql-server/introduction-to-change -数据捕获-(cdc)-in-sql-server-2008/)。但是你有SQL 2000..那么你需要正确配置**[“分布式事务协调器”](http://msdn.microsoft.com/en-us/library/ms684146(v=vs.85).aspx) **。另请参阅http://support.microsoft.com/kb/839279 可能对您有帮助。 (2认同)