2012-03-15 101 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 

,并根据你使用的工具集开发,可能有其他的选择。这实际上取决于您的需求有多复杂,但是从元数据生成您的权限脚本是一种常见的灵活解决方案。