在我们的开发环境中,我们需要在创建或附加一些数据库时运行一系列操作。清理一些表、重新播种其他表、更改电子邮件等操作。我试图使用 DDL 触发器,实际上在这里发现了一个与我类似的问题。从该代码开始,我正在尝试稍微不同的操作,但甚至无法开始。
下面的代码取自我提到的问题,我只是添加了一个条件来检查数据库名称,如果对应于我需要的那个,那么做一些动作。问题是没有在 IF BEGIN..END 中运行 SET 语句。最后一个 SELECT 使用fn_listextendedproperty
不返回任何数据。
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
您没有复制完整的示例,而是将 NULL 连接到导致它为 NULL 的 SQL 命令字符串中。如果你这样做:
它在我的系统上正常工作。