Следить за созданием базы данных и получать электронное письмо - PullRequest
0 голосов
/ 05 мая 2020

Я создал триггер на уровне сервера для управления созданием базы данных.

У меня есть этот скрипт, который отлично работал на 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

Их больше, поэтому я считаю, что триггер отправляет информация для каждого параметра конфигурации созданной новой БД, есть идеи, как получить только информацию о новой БД, созданной без всего остального?

1 Ответ

0 голосов
/ 05 мая 2020

Вы можете заменить ALTER_DATABASE на CREATE_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 Audit RESTORE DATABASE

SQL Задание агента, которое запускается (менее 1 секунды) каждую 1 минуту для копирования новой информации аудита базы данных восстановления из msdb.dbo.restorehistory в dbadata.dbo.ServerAudit. Если он обнаруживает, что восстановление базы данных произошло, но не было проверено, оно автоматически запускает задание «Настройка аудита DDL», поскольку существует вероятность того, что восстановленная база данных не настроена для аудита DDL, как ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...