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?我需要设置一个特殊的登录或什么吗?我难住了。
我会想象它是:
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 设置中有完整记录。
| 归档时间: |
|
| 查看次数: |
7501 次 |
| 最近记录: |