Tsql 如何在T-SQL中每次更改数据库对象后以编程方式发送警报

Tsql 如何在T-SQL中每次更改数据库对象后以编程方式发送警报,tsql,Tsql,我有一个触发器,它监视对数据库对象的更改。下面是我创建触发器时的代码: CREATE TRIGGER db_trg_ObjectChanges ON DATABASE FOR ALTER_PROCEDURE, DROP_PROCEDURE, ALTER_INDEX, DROP_INDEX, ALTER_TABLE, DROP_TABLE, ALTER_TRIGGER, DROP_TRIGGER, ALTER_VIEW, DROP_VIEW, ALTER_SCHEMA, DROP_SCHEM

我有一个触发器,它监视对数据库对象的更改。下面是我创建触发器时的代码:

CREATE TRIGGER db_trg_ObjectChanges
ON DATABASE
FOR ALTER_PROCEDURE, DROP_PROCEDURE,
 ALTER_INDEX, DROP_INDEX,
 ALTER_TABLE, DROP_TABLE, ALTER_TRIGGER, DROP_TRIGGER,
 ALTER_VIEW, DROP_VIEW, ALTER_SCHEMA, DROP_SCHEMA,
 ALTER_ROLE, DROP_ROLE, ALTER_USER, DROP_USER
AS
SET NOCOUNT ON
INSERT dbo.ChangeAttempt
(EventData, DBUser)
VALUES (EVENTDATA(), USER)
GO
表dbo.changeTrupt具有以下结构:

Column           Data Type       Constraints        
------           ---------       -----------

EventData        xml             NOT NULL
AttemptDate      datetime        NOT NULL DEFAULT GETDATE()
DBUser           char(50)        NOT NULL
如果在当前日期的表dbo.changetrupt中发现任何条目,我希望收到警报。电子邮件只会告诉我在当前日期在dbo.changetrupt中找到了条目。我正在使用blat或bmail发送大多数监控警报。我选择语句并将其输出到文本文件,然后通过电子邮件将输出发送给我


我的问题是:如果在dbo.changeattempt中找到当前日期的条目(表示数据库更改尝试),我如何通过编程发送警报

您不需要处理日期,只需设置一个位字段来表示您已确认更改-触发器将其设置为1,电子邮件通知程序将其重置为0。向位字段添加索引;工作完成了。。。(只要数据严重倾斜,即相对较少的设定位,位字段上的索引就有效)

您可能会结合设置审核日期和/或单独的审核表来执行此操作


您也可以选择查看service broker以在服务器上进行异步处理。

您可以只设置一个位字段来指示您已确认更改,触发器将其设置为1,电子邮件通知程序将其重置为0,而不是处理日期。向位字段添加索引;工作完成了。。。(只要数据严重倾斜,即相对较少的设定位,位字段上的索引就有效)

您可能会结合设置审核日期和/或单独的审核表来执行此操作

您也可以选择查看service broker以在服务器上进行异步处理。

创建一个夜间SQL作业(在午夜后运行)要查询changeTrupt表以查找前一天的任何AttempDate值,请使用xp\u cmdshell运行命令行电子邮件程序,或只使用xp\u sendmail

如果您希望实时执行,请向changetrupt添加一个触发器,并从中发出xp\u cmdshell或xp\u sendmail。

创建一个夜间SQL作业(午夜后运行)要查询changetrupt表中前一天的任何尝试日期值,请使用xp\u cmdshell运行命令行电子邮件程序或只使用xp\u sendmail

如果您希望实时执行,请将触发器添加到changetreat,并从那里发出xp\u cmdshell或xp\u sendmail