これは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に接続する方法を理解していないのでしょうか?特別なログインなどをセットアップする必要がありますか?私は困惑しています。
私はそのどちらかを想像します:
EXEC sp_serveroption @server = 'ServerB',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;
このオプションを使用して、Microsoft分散トランザクションコーディネーター(MS DTC)トランザクションを介してサーバー間手順のアクションを保護します。このオプションがTRUE(またはON)の場合、リモートストアドプロシージャを呼び出すと、分散トランザクションが開始され、トランザクションがMS DTCに参加します。
または、MSDTC構成の問題である可能性があります。これは、面倒で時間のかかるチェックリストであり、完全に SQL Serverで分散トランザクションを使用するための推奨MSDTC設定 に記載されています。