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

标签 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 数据库连接运行查询并在 2008 数据库上执行插入。

触发器定义如下:

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 无法启动分布式事务链接服务器...”,插入无法提交。

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

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

谢谢。

最佳答案

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

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

关于sql - 如何正确触发对链接sql服务器的插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22126993/

相关文章:

php - SQL - 选择用户名 WHERE 角色 = $string

sql - 我可以在 OVER 子句中使用变量而不是整数吗

mysql - 使用 AJAX 更新数据库

javascript - 从数组中的 SQL 捕获 PHP 变量并输出到 JavaScript 变量

php - 无法从 Centos 6 中的 PHP 连接到 mssql 服务器

database - 像 SVN 这样的东西能够看到同一个 sql server 数据库的两个实例之间的变化?

sql - 从两个带有循环外键的表中删除

SQL 服务器 : Update reporting table in real time

sql - 如何向数据库中的所有日期时间列添加一天?

asp.net - 无法更改 SSIS DTSX 包中的连接字符串