我们使用模式分隔数据库中的功能。例如,所有Create&在CMV
模式中维护值(CMV)对象。当然,每个模式都使用诸如存储过程,视图,函数等对象。
我希望按架构创建一组数据库角色,以用于安全目的。例如:
db_datareader
db_datawriter
cmv_executor //for stored procs and functions
cmv_viewer //for views
所以我的问题是:
我如何GRANT EXECUTE
(或其他)按模式将各种视图,函数和存储过程(等)捆绑到一个角色中而不用手动运行每个GRANT
?
答案 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_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的有效值。
答案 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
根据您用于开发的工具集,可能还有其他选项。这实际上取决于您的需求有多复杂,但从元数据生成权限脚本是一种常见,灵活的解决方案。