Adi*_*cov 2 sql sql-server triggers linked-server sql-server-2008
我在两个不同的sql服务器(一个是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
Run Code Online (Sandbox Code Playgroud)
这[TLVSQL].[AVI_DEV]是 2008 年的数据库名称。
但是每次我在 2000 表上执行插入时,我都会收到一条消息,指出插入由于“sqloledb 无法启动分布式事务链接服务器...”而无法提交。
链接服务器的安全委托已明确定义,我将安全凭证显式设置为 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)
)
Run Code Online (Sandbox Code Playgroud)dbo.SourceTable 上的 Triger 可以快速插入到 dbo.SyncQueue 记录需要同步的 Key
| 归档时间: |
|
| 查看次数: |
18566 次 |
| 最近记录: |