我收到了一位高价值用户的产品支持请求,要求调整全公司仪表板上的设置,以便他可以管理当前从这些报告中排除的工作流程的一部分。考虑到两个显而易见的选择

  1. 更改公司范围内所有用户的仪表板设置或
  2. 仅复制 HVU 的仪表板

...我决定创建一个“开发”实例,HVU 可以在其中看到他的仪表板的变体。为了实现这一点,我移植了 .rdl 家人到另一个人 ReportServer 相同目录树中的实例并克隆相关数据集中的所有存储过程 Schema1Schema1_dev.

问题: 存储过程和安全模式都存在于同一服务器和数据库上,因此不存在孤立用户的风险。是否可能/克隆所有当前用户权限的最佳方法是什么 Schema1Schema1_dev 除了通过 SSMS GUI 检查之外?

有帮助吗?

解决方案

这应该给你一个开始。它假设您已经克隆了所有相关对象,并且您的所有权限都位于对象或架构级别(如果您具有列级别权限,则脚本会变得更复杂一些,但也不算太糟糕)。

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