2013-04-02 32 views
2

我想設置一個MS SQL觸發器(或其他一些機制),它會自動授予某些組的db_owner權限。SQL在創建數據庫時授予其他用戶db_owner

希望我們的用戶對的SQL Server db_admin,而是我想給予他們只db_creator但每當有人創建了一個數據庫,其他用戶有權訪問該數據庫好。

我試圖創建一個SQL觸發器:

USE master 
GO 
CREATE TRIGGER trg_DDL_CreateDatabase 
ON ALL SERVER 
FOR CREATE_DATABASE 
AS 

DECLARE @databaseName varchar(max) 
SET @databaseName = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]', 'VARCHAR(255)')) 

EXEC ('USE [' + @databaseName + ']') 

IF IS_MEMBER ('DOMAIN\GROUP') = 1 
EXEC sp_addrolemember N'db_owner', N'DOMAIN\SOMEGROUP' 
ELSE 
EXEC sp_addrolemember N'db_owner', N'DOMAIN\SOMEOTHERGROUP' 

GO 

既然不能用在我使用EXEC ('USE [' + @databaseName + ']')方法試圖觸發USE聲明 - 但它也不起作用。

有什麼建議嗎?

編輯:如果我可以授予基於組成員資格的不同權限,那將是非常棒的。例如,用戶是組A的成員,然後將A添加到db_owner,如果B然後添加B,C和E等。

回答

3

每個數據庫都被創建爲[model]的副本。您在[model]中申請的任何用戶,組和津貼將自動複製到任何新創建的數據庫中。請注意,這不涉及附加的數據庫。

如果你想這樣做,通過DDL觸發器,你需要使用動態SQL的整個批:

CREATE TRIGGER trg_DDL_CreateDatabase 
ON ALL SERVER 
FOR CREATE_DATABASE 
AS 
DECLARE @databaseName sysname; 
SET @databaseName = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]', 'sysname')); 
declare @sql nvarchar(max); 
set @sql = N'USE ' + quotename(@databaseName) + N'; 
IF IS_MEMBER (''DOMAIN\GROUP'') = 1 
EXEC sp_addrolemember N''db_owner'', N''DOMAIN\SOMEGROUP'' 
ELSE 
EXEC sp_addrolemember N''db_owner'', N''DOMAIN\SOMEOTHERGROUP'';'; 
exec sp_executesql @sql; 

良好做法使用QUOTENAME()正確逃生的名字。在提取(xml方法)和存儲(變量類型)中都使用sysname作爲數據庫名稱類型。因爲它是你的代碼可以很容易地被db_creator利用來通過SQL注入來提升自己到系統管理員(創建一個合適的數據庫名稱和pwn你)。

+0

噢謝謝你,這是個好主意!但是如果我想執行一些基本的邏輯,比如授予基於組成員資格的權限。 – CMy

相關問題