监控数据库创建和接收电子邮件的时间



我在服务器级别创建了一个触发器来控制何时创建数据库。

我有一个在SQL 2014上运行良好的脚本,现在我们转到SQL 2017,脚本正在运行,但我收到了很多电子邮件

CREATE TRIGGER [ddl_trig_database]
ON ALL SERVER
FOR ALTER_DATABASE
AS
DECLARE @results NVARCHAR(max)
DECLARE @subjectText NVARCHAR(max)
DECLARE @databaseName NVARCHAR(255)
SET @subjectText = 'NEW DATABASE Created on ' + @@SERVERNAME + ' by ' + SUSER_SNAME() 
SET @results = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)'))
SET @databaseName = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]', 'VARCHAR(255)'))
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'EmailProfile',
@recipients = 'test@domain.com',
@body = @results,
@subject = @subjectText,
@exclude_query_output = 1 --Suppress 'Mail Queued' message
GO

例如,我在不同的电子邮件中收到以下每一行:

ALTER DATABASE [testNewDB] SET DELAYED_DURABILITY = DISABLED
ALTER DATABASE [testNewDB] SET RECOVERY FULL
ALTER DATABASE [testNewDB] SET  READ_WRITE
ALTER DATABASE [testNewDB] SET READ_COMMITTED_SNAPSHOT OFF

还有更多,所以我相信触发器是发送创建的新数据库的每个配置参数的信息,知道如何只接收创建的新db的信息而不接收所有其他信息吗?

您可以用CREATE_DATABASE替换ALTER_DATABASE,但这不会捕获还原事件,因为还原不会生成DLL事件。

CREATE TRIGGER [ddl_trig_database]
ON ALL SERVER
FOR CREATE_DATABASE
AS

以下文章介绍了一个解决方案,该解决方案将围绕丢失的DDL事件工作:

DDL触发器使我们能够审核DDL更改,但有一些遗漏事件、设计决策和安装复杂性。这文章解释并提供了一个完整的解决方案,其中包括对数据库恢复(没有DDL事件(和增量自安装,使整个服务器审核都为DDL配置审计

https://www.sqlservercentral.com/forums/topic/sql-2008-ddl-auditing-a-full-self-installingupdating-solution-for-whole-server

文章中针对RESTORE事件的解决方案涉及一个运行以检查新数据库的作业:

SQL 2008审核RESTORE DATABASE

SQL代理作业,每1分钟运行一次(不到1秒(从复制新的还原数据库审核信息msdb.dbo.restorehistory到dbadata.dbo.ServerAudit。如果它发现数据库还原已发生,但尚未审核自动运行"设置DDL审核"作业,因为存在还原的数据库可能未配置DDL按照预期进行审计。

最新更新