按架构在SQL Server中创建自定义数据库角色

时间:2012-03-15 14:02:18

标签: sql sql-server roles

我们使用模式分隔数据库中的功能。例如,所有Create&在CMV模式中维护值(CMV)对象。当然,每个模式都使用诸如存储过程,视图,函数等对象。

我希望按架构创建一组数据库角色,以用于安全目的。例如:

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

所以我的问题是:

我如何GRANT EXECUTE(或其他)按模式将各种视图,函数和存储过程(等)捆绑到一个角色中而不用手动运行每个GRANT

2 个答案:

答案 0 :(得分: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_datareader以外的模式中的对象进行读/写,否则不需要将用户添加到db_datawriterCMV个角色。

有关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_deschere的有效值。

答案 1 :(得分: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

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