Схема копирования SQL Server 2008 R2 со всеми разрешениями безопасности пользователя

dba.stackexchange https://dba.stackexchange.com/questions/105502

Вопрос

У меня есть запрос на поддержку продукта от важного пользователя с просьбой настроить параметры на информационной панели всей компании, чтобы он мог управлять частью своего рабочего процесса, которая в настоящее время исключена из этих отчетов.Учитывая два сразу очевидных варианта

  1. изменение настроек информационной панели для ВСЕХ пользователей всей компании или
  2. репликация информационной панели только для 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 вывод может не показать все.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top