2012-03-15 99 views
0

我們使用模式將數據庫中的功能分開。例如,所有創建維護值(CMV)對象都生存在CMV模式中。當然,每個模式使用像存儲過程,視圖,功能等對象。按模式在SQL Server中創建自定義數據庫角色

我想通過架構創建一組數據庫角色以用於安全目的。例如:

db_datareader 
db_datawriter 
cmv_executor //for stored procs and functions 
cmv_viewer //for views 

所以我的問題是:

GRANT EXECUTE(或其他)的各種視圖,函數和存儲過程(等)模式,並捆綁起來成一個單一的角色,而不怎麼辦手動運行每個GRANT

回答

1

架構權限

-- execute permission on programmability objects in CMV schema 
GRANT EXECUTE ON SCHEMA::CMV TO cmv_executor 
-- DML permissions on tables/views in CMV schema 
GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::CMV TO cmv_viewer 

這樣應該可以消除將用戶添加到db_datareaderdb_datawriter角色,除非用戶需要比其他CMV模式讀取/寫入的對象的需要。

有關granting schema permissions的更多信息,請參閱此處。

對象權限

-- use output of this query to grant permissions for individual objects 
SELECT 
    'GRANT SELECT ON ' + 
    QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + 
    QUOTENAME(name) + ' TO [cmv_viewer];' 
FROM 
    sys.objects 
WHERE 
    SCHEMA_NAME(schema_id) = 'CMV' 
     AND 
    type_desc = 'VIEW' 
UNION 
SELECT 
    'GRANT EXECUTE ON ' + 
    QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + 
    QUOTENAME(name) + ' TO [cmv_executor];' 
FROM 
    sys.objects 
WHERE 
    SCHEMA_NAME(schema_id) = 'CMV' 
     AND 
    type_desc IN ('SQL_STORED_PROCEDURE', 'SQL_SCALAR_FUNCTION', 
        'SQL_INLINE_TABLE_VALUED_FUNCTION'); 

我不包括CLR函數或過程,所以如果需要添加這些。發現type_desc列的有效值爲here

+0

EXECUTE是否代表程序AND的功能?另一個如何授予對VIEWS的權限? – 2012-03-15 14:32:04

+1

視圖不屬於'GRANT SELECT'嗎? – 2012-03-15 14:35:50

+0

@PrisonerZERO看一下這個頁面,瞭解有關權限以及它們如何應用於各種對象類型的信息。 http://msdn.microsoft.com/en-us/library/ms191291.aspx – Bryan 2012-03-15 14:55:36

0

有幾種選擇。如果權限是所有對象相同的架構中,你可以這樣做:

GRANT SELECT ON SCHEMA::CMV TO cmv_reader

如果權限是每個對象,或者你的需求更加複雜,你可以保持在源代碼管理權限腳本和新對象手動添加到它,或產生元數據中的腳本,然後執行它,例如:

select 
    'GRANT SELECT ON cmv.' + object_name(object_id) + ' TO cmv_reader;' 
from 
    sys.tables 
where 
    schema_id = schema_id('cmv') and 
    name like 'A%' -- or whatever 

,並根據你使用的工具集開發,可能有其他的選擇。這實際上取決於您的需求有多複雜,但是從元數據生成您的權限腳本是一種常見的靈活解決方案。