通过触发器通过链接服务器执行存储过程

Executing stored procedure via linked server through trigger

我在连接到 Azure SQL 数据仓库的 SQL 服务器上创建了一个链接服务器。

EXEC master.dbo.sp_addlinkedserver @server = N'LinkedserverTest', @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=N'AZserver.database.windows.net', @catalog=N'AEDW'

  /* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'LinkedserverTest', @useself=N'False', @locallogin=NULL, @rmtuser=N'SQLACcount', @rmtpassword='########'
GO        
   
EXEC master.dbo.sp_serveroption @server=N'LinkedserverTest', @optname=N'collation compatible', @optvalue=N'false'
GO
    
EXEC master.dbo.sp_serveroption @server=N'LinkedserverTest', @optname=N'data access', @optvalue=N'true'
GO
    
EXEC master.dbo.sp_serveroption @server=N'LinkedserverTest', @optname=N'dist', @optvalue=N'false'
GO
    
EXEC master.dbo.sp_serveroption @server=N'LinkedserverTest', @optname=N'pub', @optvalue=N'false'
GO
    
EXEC master.dbo.sp_serveroption @server=N'LinkedserverTest', @optname=N'rpc', @optvalue=N'true'
GO
    
EXEC master.dbo.sp_serveroption @server=N'LinkedserverTest', @optname=N'rpc out', @optvalue=N'true'
GO
    
EXEC master.dbo.sp_serveroption @server=N'LinkedserverTest', @optname=N'sub', @optvalue=N'false'
GO
    
EXEC master.dbo.sp_serveroption @server=N'LinkedserverTest', @optname=N'connect timeout', @optvalue=N'0'
GO
    
EXEC master.dbo.sp_serveroption @server=N'LinkedserverTest', @optname=N'collation name', @optvalue=null
GO
    
EXEC master.dbo.sp_serveroption @server=N'LinkedserverTest', @optname=N'lazy schema validation', @optvalue=N'false'
GO
    
EXEC master.dbo.sp_serveroption @server=N'LinkedserverTest', @optname=N'query timeout', @optvalue=N'0'
GO
    
EXEC master.dbo.sp_serveroption @server=N'LinkedserverTest', @optname=N'use remote collation', @optvalue=N'true'
GO
    
EXEC master.dbo.sp_serveroption @server=N'LinkedserverTest', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO

当我如下通过 SSMS 执行 SQL DW 的存储过程时,它正在按预期执行。

EXEC Linkedservername,Databasename.dbo.spname

但是当我尝试将该存储过程作为触发器定义的一部分执行时

CREATE TRIGGER [TriggerTest]
ON [dbo].[TriggerTest]
AFTER INSERT  
AS
BEGIN
    EXEC LSName.databasenm.dbo.SPname
END

当我尝试向 table 中插入一条记录时,出现以下错误:

Msg 596, Level 21, State 1, Line 18
Cannot continue the execution because the session is in the kill state.

Msg 46710, Level 20, State 1, Line 19
Unsupported transaction manager request 0 encountered. SQL Server Parallel DataWarehousing TDS endpoint only supports local transaction request for 'begin/commit/rollback'.

我是不是遗漏了什么或者无法通过触发器定义触发跨数据库存储过程

**更新:**上述问题已根据 David 提供的建议解决。

现在我在另一个问题中:(

我将向您介绍我正在努力完成的工作:

我有一个托管在 IaaS 中的数据库服务器,它还包括一个 MDS(主数据服务)数据库和一个普通数据库。

我的意图是,每当有人在 MDS table 中发布新数据时,都应该在 Azure SQL 数据仓库中触发一个 SP。

所以我采用了以下方法:

  1. 在 IaaS SQL 和 Azure SQL DW
  2. 之间创建链接服务器
  3. 创建触发器

我最初在该服务器的普通数据库中创建了一个虚拟触发器,并测试了链接服务器 属性 更改,您建议的更改在我尝试将记录插入 [=62] 时按预期工作=].

但是当我按照相同的过程在 MDS 后端 table 上创建触发器时,以及当我试图通过 UI 资源管理器插入新记录时;我收到错误:

并且无法添加任何记录。

注意:我可以更新 UI 中的现有记录,但不能添加新记录,因为我在 Just Insert 而不是 Update 上创建了触发器。

所以还有其他 属性 我需要更改吗?

注意:Is_trustworthy_On 属性 已在 MDS 数据库上启用

如错误所述,您无法在触发器的事务中征用远程过程执行。所以试试

EXEC master.dbo.sp_serveroption @server=N'LinkedserverTest', 
                                @optname=N'remote proc transaction promotion', 
                                @optvalue=N'false'