我在两个不同的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的用户/密码。
我做错了什么?还有另一种方式可以做我所要求的吗?
谢谢。答案 0 :(得分:3)
从触发器执行插入到链接服务器上的表 - 错误的决定。 这将对源表中的插入性能产生很大影响([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上的Triger.SourceTable可以快速插入到需要同步的dbo.SyncQueue记录键中