我写了一个小的自己的复制 - 一个触发器,它将DTC INSERT激发到另一个服务器(我自己的“复制”的一个原因:触发器正在运行它计算一些数据,另一个:它从快速版本到快递版本)。
当我使用windows authentification从同一主机进行初始插入时,它可以正常工作。但是在另一台主机上有一个Web服务器,它使用sqlserver登录(用于测试sa)。当这个主机执行初始插入时,我在DTCTransaction EventClass(Profiler)中的entlisting和Creating阶段之后得到一个内部中止。
神奇之处在于:当我第一次使用Windows身份验证从同一个主机启动它时,我可以从网络服务器启动它,它运行正常。但我只需要等几分钟就行了。
我的推理错误在哪里?
这是我的初始服务器脚本:
EXEC master.dbo.sp_addlinkedserver @server = @Servername, @srvproduct=N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = @Servername, @locallogin = NULL , @useself = N'False', @rmtuser = @Serverlogin, @rmtpassword = @Serverpwd
我想从一个sql server向另一个sql server发送一些统计表。我写了相同的触发器来做到这一点。同时我在触发器中调用一些额外的数据并将其写入第二个数据库,因此我无法使用标准复制。
我用这段代码创建了一个链接服务器:
EXEC master.dbo.sp_addlinkedserver @server = @Servername,@ srvproduct = N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = @ Servername,@ locallogin = NULL,@ useself = N'False',@ rmtuser = @Serverlogin,@ rmtpassword = @Serverpwd
我的触发器看起来像这样:
CREATE TRIGGER <schema>.<name> ON <schema>.<table> AFTER INSERT, UPDATE
-- some code
SET xact_abort ON
BEGIN DISTRIBUTED TRANSACTION
-- calculate some additional data before insert
INSERT INTO <servername>.<database>.<schema>.<table> (<columns>) VALUES (<values>)
COMMIT TRANSACTION
RETURN
如果插入触发器的启动器使用“windows authentification”,则此方法很有用。
当我使用“sql server authentification”时出现我的问题,这对我们的apache tomcat webserver是必要的:
OLE DB provider "SQLNCLI10" for linked server "<server>" returned message "Login timeout expired".
OLE DB provider "SQLNCLI10" for linked server "<server>" returned message "A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.".
Could not open a connection to SQL Server [5].
当我查看SQL Server Profiler时,DTCTransaction EventClass返回
7 - Enlisting in a DTC transaction
6 - Creating a new DTC transaction
10 - Internal abort
16 - Transaction is aborting
当我第一次运行“windows authentification”时,我可以在接下来的几分钟内成功执行带有“sql server authentification”的插入。当我稍等一下时会发生同样的错误。
所以我的第一个解决方案是将触发器改为WITH EXECUTE AS OWNER
Alter database <database> Set trustworthy ON
ALTER TRIGGER <schema>.<name> ON <schema>.<table> WITH EXECUTE AS OWNER AFTER INSERT, UPDATE
如果我使用“sql server authentification”从本地计算机运行插入,而不是从其他服务器运行插件,则此方法有效。但它也可以在另一台服务器上运行。
答案 0 :(得分:0)
这是我自己的解决方案:
您可以使用WITH EXECUTE AS:
定义触发器的执行上下文ALTER TRIGGER <triggername> ON <tablename> WITH EXECUTE AS OWNER AFTER ...
如果执行此操作并执行触发触发器的查询,则会收到错误“由于当前安全上下文不受信任,因此拒绝访问远程服务器。”(错误15274)。
但是您可以启用服务器选项:
Alter database robot5 Set trustworthy ON
......它有效。谢谢你的阅读...