web-dev-qa-db-ja.com

メッセージ7391、SQL Server上の分散トランザクション(DTC)

これはDBA関連または開発者関連の可能性がありますが、正直なところわかりません。

2つのデータベースサーバーがあります。

A: SQL Server 2005 (Trigger that uses DBMail on Server B)
B: SQL Server 2008 R2 (DBMail configured)

サーバーAに電子メール通知がキューに入れられているテーブルがあり、「挿入後」トリガーを作成してsp_send_dbmailサーバーBをこのように使用しています...

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 = '[email protected]'
        ,@recipients = @MailTo
        ,@subject = @MailSubject
        ,@body = @MailBody
END

ここで私が助けを必要とする奇妙さが始まります、これは非常に不十分に文書化された(またはそれが非常に欠けている)機能のようです。

これで、最後のステートメントをサンプルデータで実行できるようになり、すべてが問題なく動作します。しかし、そのようにテーブルに挿入しようとすると...

insert dbo.tblEmailQueue (MailTo,MailFrom,MailSubject,MailBody) values
    ('[email protected]','[email protected]','Subject','Body')

次の[〜#〜] error [〜#〜] ...

OLE DB provider "SQLNCLI" for linked server "ServerB"
    returned message "The partner transaction manager has disabled its support for
    remote/network transactions.".
Msg 7391, Level 16, State 2, Procedure mail_inserted, Line 15
The operation could not be performed because OLE DB provider "SQLNCLI" for
    linked server "ServerB" was unable to begin a distributed transaction.

トリガーのコンテキストでサーバーAがサーバーBに接続する方法を理解していないのでしょうか?特別なログインなどをセットアップする必要がありますか?私は困惑しています。

3
Chiramisu

私はそのどちらかを想像します:

EXEC sp_serveroption @server = 'ServerB',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;

このオプションを使用して、Microsoft分散トランザクションコーディネーター(MS DTC)トランザクションを介してサーバー間手順のアクションを保護します。このオプションがTRUE(またはON)の場合、リモートストアドプロシージャを呼び出すと、分散トランザクションが開始され、トランザクションがMS DTCに参加します。

または、MSDTC構成の問題である可能性があります。これは、面倒で時間のかかるチェックリストであり、完全に SQL Serverで分散トランザクションを使用するための推奨MSDTC設定 に記載されています。

7