Yar*_*lav 5 trigger sql-server ddl sql-server-2014
在我们的开发环境中,我们需要在创建或附加某些数据库时运行一系列操作。诸如清理一些表、重新播种其他表、更改电子邮件等操作。我试图使用 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
Run Code Online (Sandbox Code Playgroud)
Jon*_*ias 10
您没有复制完整的示例,而是将 NULL 连接到 SQL 命令字符串中,这导致它为 NULL。如果你这样做:
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)')
, @CreatedBy = EVENTDATA().value('(/EVENT_INSTANCE/LoginName)[1]','NVARCHAR(128)')
, @CreatedDate = EVENTDATA().value('(/EVENT_INSTANCE/PostTime)[1]','NVARCHAR(23)');
IF @DatabaseName = 'MyTestDatabase'
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 + ''';';
-- PRINT @SQL;
EXEC (@SQL);
END
GO
CREATE DATABASE MyTestDatabase;
GO
SELECT name, value
FROM MyTestDatabase.sys.fn_listextendedproperty(default, default, default, default, default, default, default)
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO
DROP DATABASE MyTestDatabase;
GO
Run Code Online (Sandbox Code Playgroud)
它在我的系统上正常工作。
归档时间: |
|
查看次数: |
3934 次 |
最近记录: |