消息 7391,SQL Server 上的分布式事务 (DTC)

Chi*_*isu 3 trigger sql-server linked-server msdtc distributed-transactions

这可能与 DBA 相关或与开发人员相关,老实说我不知道​​。

我有两个数据库服务器:

A: SQL Server 2005 (Trigger that uses DBMail on Server B)
B: SQL Server 2008 R2 (DBMail configured)
Run Code Online (Sandbox Code Playgroud)

我在服务器 A 中有一个表,其中电子邮件通知排队,我创建了一个“插入后”触发器来sp_send_dbmail使用服务器 B执行,就像这样......

A: SQL Server 2005 (Trigger that uses DBMail on Server B)
B: SQL Server 2008 R2 (DBMail configured)
Run Code Online (Sandbox Code Playgroud)

这就是我需要帮助的奇怪之处,请注意,这似乎是一个记录非常差(或严重缺乏)的功能。

现在我可以使用一些示例数据执行最后一条语句,一切正常。但是当我尝试像这样插入表格时......

USE SampleDB
ALTER TRIGGER [dbo].[mail_inserted] 
   ON [dbo].[tblEmailQueue]
   AFTER INSERT
AS 
BEGIN
    declare @MailTo nvarchar(max), @MailSubject nvarchar(max), @MailBody nvarchar(max)
    -- Initialize vars
    select @MailTo=MailTo from inserted
    select @MailSubject=MailSubject from inserted
    select @MailBody=MailBody from inserted

    -- Send email via DbMail on ServerB
    exec [ServerB].msdb.dbo.sp_send_dbmail --this runs fine by itself, but not via trigger
        @profile_name = 'Test Profile'
        ,@from_address = 'noreply@test.com'
        ,@recipients = @MailTo
        ,@subject = @MailSubject
        ,@body = @MailBody
END
Run Code Online (Sandbox Code Playgroud)

我收到以下错误...

insert dbo.tblEmailQueue (MailTo,MailFrom,MailSubject,MailBody) values
    ('to-me@test.com','from-somebody@test.com','Subject','Body')
Run Code Online (Sandbox Code Playgroud)

也许我不明白在触发器的上下文下服务器 A 如何连接到服务器 B?我需要设置一个特殊的登录或什么吗?我难住了。

Mar*_*ith 7

我会想象它是:

EXEC sp_serveroption @server = 'ServerB',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;
Run Code Online (Sandbox Code Playgroud)

使用此选项可通过 Microsoft 分布式事务协调器 (MS DTC) 事务保护服务器到服务器过程的操作。当此选项为 TRUE(或 ON)时,调用远程存储过程将启动分布式事务并使用 MS DTC 登记该事务。

或者可能是 MSDTC 配置的问题,这是一个费力且冗长的检查清单,在 SQL Server 中使用分布式事务的推荐 MSDTC 设置中有完整记录。