Создание пользовательских ролей базы данных в SQL Server по схеме - PullRequest
0 голосов
/ 15 марта 2012

Мы разделяем функции в нашей базе данных, используя схемы.Например, все объекты Create & Maintain Value (CMV) находятся в схеме CMV.Конечно, каждая схема использует такие объекты, как хранимые процедуры, представления, функции и т. Д.

Я хочу создать набор ролей базы данных по схеме для использования в целях безопасности.Например:

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

Итак, мой вопрос:

Как мне GRANT EXECUTE (или что-то еще) для различных представлений, функций и хранимых процедур (и т. Д.) По схеме и связать ихв одну роль без запуска каждого GRANT вручную?

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Схема прав доступа

-- 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.

Дополнительную информацию о предоставлении разрешений на схему см. Здесь .

Права доступа к объекту

-- 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 здесь .

0 голосов
/ 15 марта 2012

Есть несколько вариантов. Если разрешения одинаковы для всех объектов в схеме, вы можете сделать это:

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

И в зависимости от того, какой набор инструментов вы используете для разработки, могут быть и другие варианты. На самом деле все сводится к тому, насколько сложны ваши требования, но генерация сценариев разрешений из метаданных является распространенным гибким решением.

...