Sql-Server-2008-R2

具有所有使用者安全權限的 SQL Server 2008 R2 複製架構

  • August 21, 2015

我有一個來自高價值使用者的產品支持請求,要求調整公司範圍儀表板上的設置,以便他可以管理目前從這些報告中排除的工作流部分。鑑於兩個立即顯而易見的選擇

  1. 更改公司範圍內所有使用者的儀表板設置或
  2. 僅為 HVU 複製儀表板

…決定我應該創建一個“開發”實例,讓 HVU 可以看到他的儀表板的變體。為此,我將該系列移植到相同目錄樹中的.rdl另一個實例,並將相關數據集中的所有儲存過程從.ReportServer``Schema1``Schema1_dev

**問題:**儲存過程和安全模式都存在於同一台伺服器和數據庫上,因此不存在孤兒使用者的風險。除了通過 SSMS GUI 檢查之外,是否有可能/將所有目前使用者權限複製到的最佳方法是什麼Schema1Schema1_dev

這應該給你一個開始。它假定您已經複製了所有相關對象,並且您的所有權限都在對像或模式級別(如果您具有列級別權限,腳本會變得更複雜一些,但還不錯)。

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輸出可能不會顯示所有內容

引用自:https://dba.stackexchange.com/questions/105502