我正在尝试创建一个触发器,只有在插入时才会发送电子邮件。我目前收到一封电子邮件,无论是否插入,我只想在表格中插入时才收到电子邮件。以下是触发器当前的样子
ALTER TRIGGER [dbo].[myTriggerName]
ON [dbo].[myTableName]
AFTER INSERT
AS
BEGIN
EXEC msdb.dbo.sp_send_dbmail
@recipients = 'MyRecipients',
@profile_name = 'DBAdmins',
@subject = 'MySubject',
@body = 'Body';
END
答案 0 :(得分:3)
我会非常小心地进行大量处理或直接将电子邮件发送到触发器中。
触发器在调用事务的上下文中执行,从而延迟该事务的完成,直到完成为止。
如果您有外部依赖项(如SMTP服务器),您可以快速进入超时等情况。
触发器应该非常灵活,小而快。
我的建议是:
在单独的表EmailToSend
中记下您需要的所有必要信息(收件人,主题,正文,日期)
CREATE TRIGGER trgYourTableInsert
ON dbo.YourTable
AFTER INSERT
AS
INSERT INTO dbo.EmailToSend(Recipient, Subject, Body)
VALUES('john.doe@acme.org', 'Hello there', '.......')
有一个单独的进程(例如,每小时运行一次的计划存储过程)检查该表并进行实际发送电子邮件(不阻止任何其他进程/事务) - :
SELECT (list of columns)
FROM dbo.EmailToSend
WHERE DateSent IS NULL
或类似的东西 - 它真的在很大程度上取决于你将完全放入该表中以及你想如何处理这个......
答案 1 :(得分:1)
CREATE TRIGGER dbo.trg_I_tbl
ON dbo.tbl
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @text NVARCHAR(MAX)
SELECT @text = STUFF((
SELECT ', ' + col
FROM INSERTED
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '')
EXEC msdb.dbo.sp_send_dbmail
@recipients = 'your_account@gmail.com',
@subject = 'caption',
@body = @text
END
GO