Сценарии полномочий SQL Server

Я хочу скопировать все разрешение, которое я установил на хранимых процедурах и другом материале от моей базы данных разработки до моей производственной базы данных. Это является невероятно громоздким, не говоря уже о подверженном ошибкам, чтобы сделать это все вручную через инструмент SSMS GUI.

Таким образом, я ищу путь, я могу непосредственно вывести набор полномочий в одной базе данных и применить те те же полномочия к отдельной базе данных (по-видимому, имеющий ту же схему).

42
задан Chris Wuestefeld 31 December 2009 в 21:34
поделиться

2 ответа

Встроенные представления каталогов базы данных предоставляют информацию для этого. Попробуйте выполнить этот запрос:

SELECT
  (
    dp.state_desc + ' ' +
    dp.permission_name collate latin1_general_cs_as + 
    ' ON ' + '[' + s.name + ']' + '.' + '[' + o.name + ']' +
    ' TO ' + '[' + dpr.name + ']'
  ) AS GRANT_STMT
FROM sys.database_permissions AS dp
  INNER JOIN sys.objects AS o ON dp.major_id=o.object_id
  INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id
  INNER JOIN sys.database_principals AS dpr ON dp.grantee_principal_id=dpr.principal_id
WHERE dpr.name NOT IN ('public','guest')
--  AND o.name IN ('My_Procedure')      -- Uncomment to filter to specific object(s)
--  AND dp.permission_name='EXECUTE'    -- Uncomment to filter to just the EXECUTEs

Для каждого из прав доступа в БД будет выдано несколько команд (GRANT/DENY). Из этого можно скопировать и вставить их в другое окно запроса и выполнить, чтобы сгенерировать те же самые права, которые были на оригинале. Например:

GRANT EXECUTE ON [Exposed].[EmployeePunchoutReservationRetrieve] TO [CustomerAgentRole]
GRANT EXECUTE ON [Exposed].[EmployeePunchoutReservationStore] TO [CustomerAgentRole]
GRANT EXECUTE ON [Exposed].[EmployeePunchoutSendOrderLogStore] TO [CustomerAgentRole]
GRANT EXECUTE ON [Exposed].[EmployeeReportSubscriptions] TO [CustomerAgentRole]

Обратите внимание на нижнюю строку, закомментированную, это фильтрация по имени permission_name. Если не прокомментировать эту строку, то запрос будет выдавать только разрешения EXECUTE (т.е. разрешения для хранимых процедур).

73
ответ дан 26 November 2019 в 23:19
поделиться

Да, вы можете использовать сценарий, такой как это для генерации другого скрипта

SET NOCOUNT ON;
DECLARE @NewRole varchar(100), @SourceRole varchar(100);

-- Change as needed
SELECT @SourceRole = 'Giver', @NewRole = 'Taker';

SELECT
    state_desc + ' ' + permission_name + ' ON ' + OBJECT_NAME(major_id) + ' TO ' + @NewRole
FROM
    sys.database_permissions
WHERE
    grantee_principal_id = DATABASE_PRINCIPAL_ID(@SourceRole) AND
    -- 0 = DB,  1 = object/column, 3 = schema. 1 is normally enough
    class <= 3

Это взято из моего ответа здесь

5
ответ дан 26 November 2019 в 23:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: