我在两个不同的 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])中的插入性能产生很大影响 还有分布式事务和配置服务器 支持分布式事务 - 噩梦。
一种可能的解决方案是:
在源服务器上您可以创建同步队列表。例如:
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) )
dbo.SourceTable上的Triger可以快速插入到dbo.SyncQueue中需要同步的记录Key
- 一些定期执行的存储过程可以将队列中的记录插入到 链接服务器上的表。
关于sql - 如何正确触发对链接sql服务器的插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22126993/