如何正确触发插入到链接的SQL Server?

时间:2014-03-02 11:31:54

标签: sql sql-server sql-server-2008 triggers linked-server

我在两个不同的sql server中有相同的表(一个是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

[TLVSQL].[AVI_DEV]是2008 db名称。

但每次我在2000表上执行插入操作时,都会收到一条消息,表明插件无法提交,因为“sqloledb无法启动分布式事务链接服务器......”。

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

我做错了什么?还有另一种方式可以做我所要求的吗?

谢谢。

1 个答案:

答案 0 :(得分:3)

从触发器执行插入到链接服务器上的表 - 错误的决定。 这将对源表中的插入性能产生很大影响([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)
    )
    
  2. dbo上的Triger.SourceTable可以快速插入到需要同步的dbo.SyncQueue记录键中

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