代码之家  ›  专栏  ›  技术社区  ›  Adiel Yaacov

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

  •  1
  • Adiel Yaacov  · 技术社区  · 11 年前

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

    我正在使用sql server management studio。

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

    sqlserver2008被定义为链接服务器,可以使用sqlservermanagementstudio从2000db连接对2008db运行查询和执行插入。

    触发器定义如下:

    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数据库名称。

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

    链接服务器的安全委派定义良好,我将安全凭据显式设置为db_owner的用户/密码。

    我做错了什么?有没有其他方法可以满足我的要求?

    非常感谢。

    1 回复  |  直到 11 年前
        1
  •  4
  •   Aleksei Semidotskii    11 年前

    在链接服务器上执行从触发器到表的插入-错误的决定。 这将极大地影响源表([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.SourceTable上的触发器可以快速插入dbo.SyncQueue记录中需要同步的密钥

    3. 一些定期执行的存储过程可以在 表。