我的触发器是在执行吗

时间:2014-04-26 17:20:45

标签: sql-server triggers

按照以下指南,我在MSSQL SERVER 2008中创建了我的第一个MSSQL触发器; http://www.4guysfromrolla.com/webtech/tips/t051706-1.shtml

我已在SQL Server Management Studio中设置邮件并且测试邮件成功运行,但我从未从触发器中收到电子邮件。两个问题;

1)我的触发器有效吗? 2)执行触发器时MSSQL Server在哪里记录?

CREATE TRIGGER updTicketHeader
on TicketHeader
FOR UPDATE
AS
IF (SELECT COUNT(*) FROM inserted) = 1
BEGIN
declare @body varchar(3000)
declare @TicketNumber int
declare @originatorFirst varchar(64)
declare @originatorLast varchar(64)
declare @originatorEmail varchar(64)
declare @ticketSubject varchar(16)
declare @priority int
declare @ticketDescription varchar(128)
SELECT @TicketNumber = ticketNumber,
@originatorFirst = originatorFirst,
@originatorLast = originatorLast,
@originatorEmail = originatorEMail,
@ticketSubject = ticketSubject,
@priority = priority,
@ticketDescription = ticketDescription
FROM inserted

SET @body = 
'New ticket ' + @TicketNumber + ' has been created!
First Name: ' + @originatorFirst + '
Last Name: ' + @originatorLast + '
Email: ' + @originatorEmail + '
Priority: ' + @priority + '
Ticket Subject: ' + @ticketSubject + '
Ticket Description: ' + @ticketDescription

EXEC master..xp_sendmail
@recipients = 'support@atbashservices.com',
@subject = 'New Ticket ' + @ticketNumber + ' has been created!',
@message = @body
END 
GO

感谢Code Magician的帮助!

我的触发器现在使用以下代码;

CREATE TRIGGER updTicketHeader
on TicketHeader
FOR INSERT
AS
IF (SELECT COUNT(*) FROM inserted) = 1
BEGIN
declare @body varchar(3000)
declare @TicketNumber varchar(8)
declare @originatorFirst varchar(64)
declare @originatorLast varchar(64)
declare @originatorEmail varchar(64)
declare @ticketSubject varchar(16)
declare @priority varchar(8)
declare @ticketDescription varchar(128)
SELECT @TicketNumber = ticketNumber,
@originatorFirst = originatorFirst,
@originatorLast = originatorLast,
@originatorEmail = originatorEMail,
@ticketSubject = ticketSubject,
@priority = priority,
@ticketDescription = ticketDescription
FROM inserted

SET @body = 
'New ticket ' + @TicketNumber + ' has been created!
First Name: ' + @originatorFirst + '
Last Name: ' + @originatorLast + '
Email: ' + @originatorEmail + '
Priority: ' + @priority + '
Ticket Subject: ' + @ticketSubject + '
Ticket Description: ' + @ticketDescription

EXEC msdb.dbo.sp_send_dbmail
@recipients = 'support@atbashservices.com',
@profile_name = 'Default',
@subject = 'New Ticket has been created!',
@body = @body
END 
GO

1 个答案:

答案 0 :(得分:1)

<强>哇。为什么是您的触发器FOR UPDATE但您的电子邮件正在讨论正在创建的新票证?考虑使用FOR INSERT

如果这不是唯一的问题,下面的所有内容仍然值得一读。

首先,你的触发器完全有可能发射但没有做任何事情。 从不假设您的更新/插入/删除只是一条记录。

我看到你的代码正在检查受影响的单行,但是如果同时更新了两行,则不会发生任何事情。如果您希望每次更新都发送电子邮件,那么编写循环可能会更好。

SQL不记录触发器正在触发,触发器与触发它们的SQL一样是事务性的。换句话说,如果您的更新有效,则触发器有效。在这种情况下,您要么正在进行多行更新,而您的触发器正在跳过,或者您没有正确配置xp_sendmail。我怀疑后者。

我建议不要使用xp_sendmail。对于初学者来说,它已被弃用了。配置也很麻烦,它需要在数据库服务器上安装MAPI客户端(如outlook)。

这些天从数据库发送电子邮件的首选方法是使用sp_dbmail。而不是SQL服务器向Outlook Express的本地安装发送命令,sp_dbmail将只使用SMTP。

此外,sp_dbmail 将记录您发送的电子邮件。它保留传出电子邮件的副本,并将它们存储在下表中: sysmail_allitemssysmail_sentitemssysmail_unsentitemssysmail_faileditems

解决实际问题变得更加容易。在sysmail_mailitems表中可以看到使用sp_dbmail已发送项目状态。如果sent_status为1则成功发送,故障为2且未发送3。

无论如何,请阅读有关dbmail here

的所有信息

here's a video描述了如何在SQL 2008中配置数据库邮件