Sql-Server

觸發數據庫創建或附加操作

  • November 5, 2015

在我們的開發環境中,我們需要在創建或附加一些數據庫時執行一系列操作。清理一些表、重新播種其他表、更改電子郵件等操作。我試圖使用 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 命令字元串中。如果你這樣做:

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

它在我的系統上正常工作。

引用自:https://dba.stackexchange.com/questions/120241