【发布时间】:2018-10-11 18:48:51
【问题描述】:
我在创建触发器时遇到问题,当设备连接到 IP 下载器并将数据发送到 SQL Server 中的表时,该触发器将向分发列表发送包含插入数据表的电子邮件。我需要从最近的条目(一次下载中的 23-26 行)中选择日期、下载 ID 和描述,然后将其格式化为电子邮件并发送出去。
我对 SQL 比较陌生,所以我不确定我需要在哪里查看触发器正在生成什么错误。下面是我一直在尝试使用的代码块。任何建议或意见将不胜感激。当我手动运行 select 语句和电子邮件存储过程时,它工作正常。一旦我把它变成触发器,它就会失败。
CREATE TRIGGER [dbo].[Trg_Download]
ON [dbo].[DownloadData]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @DownloadID VARCHAR(7)
DECLARE @xml NVARCHAR(MAX)
DECLARE @body NVARCHAR(MAX)
SET @DownloadID = (SELECT TOP 1 downloadID
FROM inserted
ORDER BY downloadid DESC)
SET @xml = CAST((SELECT [Date] AS 'td','',[DownloadID] AS 'td','', [Description] AS 'td'
FROM inserted
WHERE [DownloadID] = @downloadID
ORDER BY Description
FOR XML PATH('tr'), ELEMENTS) AS NVARCHAR(MAX))
SET @body = '<html><body><H3>Line Clearout Summary</H3>
<table border = 1>
<tr>
<th> Date </th> <th> DownloadID </th> <th> Description </th></tr>'
SET @body = @body + @xml +'</table></body></html>'
EXEC msdb.dbo.sp_send_dbmail
@profile_name = N'DBMail',
@body = @body,
@body_format = HTML,
@recipients = N'DistributionList@GMAIL.com',
@subject = 'Line Clearout Summary'
END
谢谢
【问题讨论】:
-
考虑将电子邮件发送命令放在填充表格的代码中
-
不幸的是,我无权修改填充表格的代码
-
就像@lad2025 说的,不要这样做;它可能会导致各种问题。例如,如果电子邮件由于某种原因无法发送(可能您的电子邮件服务器已关闭,或者未经许可使用
sp_send_dbmail的人尝试发送INSERT),那么INSERT将失败。这不应该是预期的行为。TRIGGER是您应该放置逻辑以发送电子邮件的最后一个位置之一。 -
触发器与触发它的代码在同一事务中运行,因此请将该代码添加到您的问题中。我在触发代码中没有看到任何明显错误。你也说它不工作,但你不知道错误是什么。你怎么知道有错误? “不工作”是什么意思?
标签: sql sql-server sql-server-2012 triggers