小编典典

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

sql

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

我正在使用SQL Server Management Studio。

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

sql server 2008被定义为链接服务器,并且可以使用sql server management studio通过2000 db连接在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的用户/密码。

我究竟做错了什么 ?还有我要问的另一种方式吗?

谢谢你。


阅读 306

收藏
2021-03-23

共1个答案

小编典典

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

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

2021-03-23