当前位置: 首页 > 面试题库 >

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

顾恺
2023-03-14
问题内容

我在两个不同的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的用户/密码。

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

谢谢你。


问题答案:

从触发器执行插入到链接服务器上的表中-错误的决定。这将极大地影响源表([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. 然后,一些定期执行的存储过程可以从队列中的链接服务器上的表中插入记录。



 类似资料:
  • 本文向大家介绍如何正确使用Nodejs 的 c++ module 链接到 OpenSSL,包括了如何正确使用Nodejs 的 c++ module 链接到 OpenSSL的使用技巧和注意事项,需要的朋友参考一下 事情的起因是这样的, 因为某些原因, 最近在写 Nodejs 的 c++ module, 然后在js这边调用。  网络通信自然离不开ssl, 于是需要链接到Openssl的库。 我们本来的

  • insertUrl(int $row, int $column, string $url[, string $text, string $toolTip, resource $formatHandler]) int $row $excel = new \Vtiful\Kernel\Excel($config); ​ $urlFile = $excel->fileName("free.xlsx")

  • 我似乎找不到每一行的控件。这些行是用addrow()方法添加的,该方法非常有效,只需要一些化妆品。我的目标是在更改select选项时获取行中每个控件的值。但是,该函数从未启动,我无法获得该行的控制值。 超文本标记语言 JQuery

  • 我正在尝试为一个项目创建一个双链接列表容器。我不能使用任何std容器。必须对双链接列表进行排序。以下是我目前的代码: 我遇到的问题是在我的插入函数中。我正在使用调试器,并在以下行插入代码:list.insert(10);。 它正确地进入第一种情况,即head==nullptr并创建节点。当我进入下一行代码(list.insert(20))时,它会用这一行创建一个节点:node*node=newno

  • 问题内容: 使用sql Server2005。我声明了一个触发条件,该触发条件被触发为“ AFTER INSERT,UPDATE”,在此触发条件下,我使用WHILE和CURSOR在INSERTED表的行上循环。当我找到不满足特定条件的行时: 我希望触发器引发错误,并且不要插入任何触发触发器的行(甚至不包括那些已经满足我条件的行)。<-–我不知道该怎么做! 您能告诉我如何增加错误并防止插入吗? 问题

  • 在“name=new.user_name”后面发现意外的标记“end-of-statement”。预期的令牌可能包括:“”..sqlcode=-104,sqlstate=42601,driver=4.9.78 SQL code:-104,SQL state:42601