2012-12-13 120 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')