使用 SQL Server Management Studio 2012
我希望每次表中的某个字段大于零时都会向我发送一封电子邮件。这种情况并不经常发生,但我希望在发生时收到警报。
我只想收到新插入的电子邮件,而不是以前的任何插入。在下面的示例中,将第 3 列作为感兴趣的字段,Harry 是最新的插入内容,并且第 3 列大于零。这是我希望收到警报的时候,因为您可以看到 Jack 也大于零,但我们假设这是一个较旧的条目,所以我不希望它出现在电子邮件中。
Name Department Column3 Column4 Column5
Harry HR 2 ABC DEF
James Sport 0 ABC DEF
Jack Finance 1 ABC DEF
SQL 中的电子邮件功能相对较新,但了解以下基础知识
use Database
go
begin
Execute msdb.dbo.sp_send_dbmail
@recipients = 'emailaddress',
@query = 'select Name, department, Column3 from mytable
where Column3 > 0 '
End
INSERTED
表中的值,并在该值超过指定数量时执行
sp_send_dbmail
。 下面是一个触发器示例。 使用
sp_send_dbmail
需要正确配置数据库邮件(如果您尚未配置)。 有关数据库邮件和设置的更多详细信息,请参阅此处。 游标用于为添加/更新的每个新行发送电子邮件。 由于您只想从新行或更新行中获取数据,因此这是从
INSERTED
表而不是查询获取的,然后用于构建
@body
的
sp_send_dbmail
参数。 请注意,
CONCAT
用于保护空值,就好像多个字符串与
+
运算符相加在一起,其中一个为空,则整个连接的字符串将为空。 但是,如果使用
CONCAT
,非空字符串仍将被保留。 表变量用于最初从
INSERTED
表获取值,这些值稍后将输入到游标中。
INSERTED
表将捕获来自
INSERT
和
UPDATE
操作的值。 从您的问题来看,您似乎仍然希望将新值添加到表中,因此使用了
AFTER
触发器。
CREATE TRIGGER dbo.TestTrigger
ON YourDatabase.YourSchema.YourTable
AFTER INSERT, UPDATE
AS
BEGIN
DECLARE @NewColumn3 INT;
DECLARE @NewName VARCHAR(25);
DECLARE @NewDepartment VARCHAR(25);
DECLARE @Tab Table (COLUMN3 INT, NAME VARCHAR(25), DEPARTMENT VARCHAR(25));
DECLARE @Message VARCHAR(2000);
INSERT INTO @Tab
SELECT COLUMN3, NAME, DEPARTMENT
FROM INSERTED
IF EXISTS((SELECT COLUMN3 FROM @Tab where COLUMN3 > 0))
BEGIN
--make sure to only add data from rows where COLUMN3 > 0
DECLARE EmailCursor CURSOR FOR
SELECT COLUMN3, NAME, DEPARTMENT FROM @Tab WHERE COLUMN3 > 0
OPEN EmailCursor
FETCH NEXT FROM EmailCursor
INTO @NewVal, @NewName, @NewDepartment
--while there are still rows
WHILE (@@FETCH_STATUS = 0)
BEGIN
--use CONCAT to avoid null value voiding message
SET @Message = CONCAT('Name ', @NewName, ' from department ', @NewDepartment, ' added a value of ', @NewVal)
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'YourProfileName',
@recipients = '[email protected]',
@body = @Message,
@subject = 'Email Subject';
FETCH NEXT FROM EmailCursor
INTO @NewVal, @NewName, @NewDepartment
END
CLOSE EmailCursor
DEALLOCATE EmailCursor
END
END
SELECT *
FROM [DB_BEBOP_LIVE].[dbo].[order_change]
where reason= 'Broker Not Connected'
order by time desc
有人可以帮助我如何通过示例警报执行此操作(可能使用触发器或数据库邮件),谁会通知我。
谢谢。