Схема копирования SQL Server 2008 R2 со всеми разрешениями безопасности пользователя
-
26-09-2020 - |
Вопрос
У меня есть запрос на поддержку продукта от важного пользователя с просьбой настроить параметры на информационной панели всей компании, чтобы он мог управлять частью своего рабочего процесса, которая в настоящее время исключена из этих отчетов.Учитывая два сразу очевидных варианта
- изменение настроек информационной панели для ВСЕХ пользователей всей компании или
- репликация информационной панели только для HVU
... было решено, что я должен создать экземпляр «dev», где HVU сможет видеть вариант своей панели управления.Для этого я портировал .rdl
семья к другому ReportServer
экземпляр в идентичном дереве каталогов и клонировал все хранимые процедуры в соответствующих наборах данных из Schema1
к Schema1_dev
.
Вопрос: хранимые процедуры и схема безопасности существуют на одном сервере и в базе данных, поэтому риск появления пользователей-сирот отсутствует.Возможно ли/какой лучший способ клонировать все текущие права пользователя из Schema1
к Schema1_dev
кроме проверки через графический интерфейс SSMS?
Решение
Это должно дать вам начало.Предполагается, что вы уже клонировали все соответствующие объекты и что все ваши разрешения находятся на уровне объекта или схемы (если у вас есть разрешения на уровне столбца, сценарий становится немного сложнее, но не так уж и плохо).
DECLARE
@oldschema SYSNAME = N'schema1',
@newschema SYSNAME = N'schema1_dev';
DECLARE
@sql NVARCHAR(MAX) = N'';
SELECT @sql += N'
' + p.state_desc + N' '
+ p.[permission_name] + N' ON '
+ QUOTENAME(@newschema) + N'.' + QUOTENAME(o.name)
+ N' TO ' + QUOTENAME(dp.name) + N';'
FROM sys.database_permissions AS p
INNER JOIN sys.objects AS o
ON p.major_id = o.[object_id]
INNER JOIN sys.schemas AS s
ON o.[schema_id] = s.[schema_id]
INNER JOIN sys.database_principals AS dp
ON p.grantee_principal_id = dp.principal_id
WHERE p.class_desc = N'OBJECT_OR_COLUMN'
AND s.name = @oldschema;
SELECT @sql += N'
' + p.state_desc + N' '
+ p.[permission_name] + N' ON SCHEMA::'
+ QUOTENAME(@newschema)
+ N' TO ' + QUOTENAME(dp.name) + N';'
FROM sys.database_permissions AS p
INNER JOIN sys.schemas AS s
ON p.major_id = s.[schema_id]
INNER JOIN sys.database_principals AS dp
ON p.grantee_principal_id = dp.principal_id
WHERE p.class_desc = N'SCHEMA'
AND s.name = @oldschema;
PRINT @sql;
-- EXEC sys.sp_executesql @sql;
Обратите внимание: если у вас есть много объектов и/или много пользователей, тот PRINT
вывод может не показать все.