Я хочу скопировать все разрешение, которое я установил на хранимых процедурах и другом материале от моей базы данных разработки до моей производственной базы данных. Это является невероятно громоздким, не говоря уже о подверженном ошибкам, чтобы сделать это все вручную через инструмент SSMS GUI.
Таким образом, я ищу путь, я могу непосредственно вывести набор полномочий в одной базе данных и применить те те же полномочия к отдельной базе данных (по-видимому, имеющий ту же схему).
Встроенные представления каталогов базы данных предоставляют информацию для этого. Попробуйте выполнить этот запрос:
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 (т.е. разрешения для хранимых процедур).
Да, вы можете использовать сценарий, такой как это для генерации другого скрипта
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