Sql-Server
觸發數據庫創建或附加操作
在我們的開發環境中,我們需要在創建或附加一些數據庫時執行一系列操作。清理一些表、重新播種其他表、更改電子郵件等操作。我試圖使用 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
它在我的系統上正常工作。