具有所有用户安全权限的 SQL Server 2008 R2 复制架构
-
26-09-2020 - |
题
我收到了一位高价值用户的产品支持请求,要求调整全公司仪表板上的设置,以便他可以管理当前从这些报告中排除的工作流程的一部分。考虑到两个显而易见的选择
- 更改公司范围内所有用户的仪表板设置或
- 仅复制 HVU 的仪表板
...我决定创建一个“开发”实例,HVU 可以在其中看到他的仪表板的变体。为了实现这一点,我移植了 .rdl
家人到另一个人 ReportServer
相同目录树中的实例并克隆相关数据集中的所有存储过程 Schema1
到 Schema1_dev
.
问题: 存储过程和安全模式都存在于同一服务器和数据库上,因此不存在孤立用户的风险。是否可能/克隆所有当前用户权限的最佳方法是什么 Schema1
到 Schema1_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
输出可能无法显示所有内容.
不隶属于 dba.stackexchange