Em nosso ambiente de desenvolvimento, precisamos executar várias ações quando alguns bancos de dados são criados ou anexados. Ações como limpar algumas tabelas, propagar novamente algumas outras, alterar e-mails, etc. Eu estava tentando usar gatilhos DDL e realmente encontrei aqui uma pergunta semelhante à minha. A partir desse código, estou tentando uma ação ligeiramente diferente, mas não consigo nem começar.
O código a seguir, retirado da pergunta que mencionei, acabei de adicionar uma condição para verificar o nome do banco de dados e, se corresponder ao que preciso, faça alguma ação. O problema é que não há execução da instrução SET dentro do IF BEGIN..END. O último SELECT usando fn_listextendedproperty
não retorna nenhum dado.
IF EXISTS (SELECT NULL FROM sys.server_triggers WHERE name = 'ddl_trig_database')
BEGIN
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
END
GO
CREATE TRIGGER ddl_trig_database
ON ALL SERVER
FOR CREATE_DATABASE
AS
DECLARE
@DatabaseName NVARCHAR(128)
, @CreatedBy NVARCHAR(128)
, @CreatedDate NVARCHAR(23)
, @SQL NVARCHAR(4000);
SELECT @DatabaseName = EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]','NVARCHAR(128)');
IF @DatabaseName = N'asd'
BEGIN
SET @SQL = '
USE ' + @DatabaseName + ';
EXEC sys.sp_addextendedproperty @name = N''Owner'', @value = N''' + @CreatedBy + ''';
EXEC sys.sp_addextendedproperty @name = N''StartDate'', @value = N''' + @CreatedDate + ''';';
EXEC (@SQL);
END;
GO
CREATE DATABASE asd;
GO
SELECT name, value
FROM asd.sys.fn_listextendedproperty(default, default, default, default, default, default, default)
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO
DROP DATABASE asd;
GO
Você não copiou o exemplo completo e está concatenando NULL na string de comando SQL, o que faz com que seja NULL. Se você fizer isto:
Funciona corretamente no meu sistema.