2012-12-13 157 views
0

我們的非生產服務器定期從生產中刷新信息。這樣做的方式是對生產進行完整備份,然後將其恢復到非生產SQL Server上。這具有覆蓋用戶的所有權限的不利影響。SQL Server 2005登錄,安全性,角色和權限備份

我一直在試圖找到一種方法來將這些權限從腳本的形式拉出數據庫。這樣當刷新數據庫時,我可以針對新刷新的數據庫運行腳本並恢復權限。

我試圖在sys.database_principals和sys.database_permissions中找到數據,但是我的SQL-fu不足以將這些數據變成可用的東西。

獲取這些數據的最佳方法是什麼?

+0

什麼不對的:http://stackoverflow.com/questions/1987190/scripting-sql-server-permissions?rq=1 – RBarryYoung

回答

1

K. Brian Kelley在SQLServerCentral有一個非常好的腳本。

您也可以嘗試本頁面右側的一些「相關」鏈接。

+0

是啊,這是正是我需要。我無法相信自己無法找到。非常感謝你的幫助。 – tpederson

1

繼承人另一個工作安靜類似但支持列級權限。輸出有效,但對於更復雜的數據庫必須改進。所以,只給你的想​​法:

SELECT 'GRANT ' + database_permissions.permission_name + ' ON ' + 
    CASE database_permissions.class_desc 
     WHEN 'SCHEMA' THEN schema_name(major_id) 
     WHEN 'OBJECT_OR_COLUMN' THEN 
      CASE WHEN minor_id = 0 THEN object_name(major_id) COLLATE Latin1_General_CI_AS_KS_WS 
      ELSE (SELECT object_name(object_id) + ' ('+ name + ')' 
        FROM sys.columns 
        WHERE object_id = database_permissions.major_id 
        AND column_id = database_permissions.minor_id) end 
     ELSE 'other' 
    END + 
    ' TO ' + database_principals.name COLLATE Latin1_General_CI_AS_KS_WS 
FROM sys.database_permissions 
JOIN sys.database_principals 
ON database_permissions.grantee_principal_id = database_principals.principal_id 
LEFT JOIN sys.objects -- consider schemas 
ON objects.object_id = database_permissions.major_id 
WHERE database_permissions.major_id > 0 
AND permission_name in ('SELECT','INSERT','UPDATE','DELETE')