2013-09-27 38 views
0

我们经常负责在我们的生产和开发环境之间备份和恢复数据库。当这些服务器位于不同的区域时,这个任务中最枯燥的部分是在SQL中一个一个地重新创建数据库用户。在还原的数据库上重新创建安全性?

我正在寻找一种方法来检索特定数据库(Windows用户和组,SQL用户和角色)上的所有用户以及他们当前的权限级别,然后在数据库恢复后以某种方式使用这些结果重新创建权限。

任何人都可以帮助我开始正确的方向吗?

问候,

马修

回答

0

下面的查询应该: 创建保存查询一个临时表来执行 负载与查询的临时表中添加所有登录 负载与查询的临时表中添加的所有用户(登录) 负载该查询添加所有权限(表)

然后它打印出所有这些语句,您应该能够复制到新环境中的查询窗口并执行。

希望这对你来说是一个很好的起点。

if object_id('dbo.tempUsers') is not null 
Drop table dbo.tempUsers 

Create table tempUsers(ID int identity , Queries Varchar(255)) 

Insert into tempUsers(Queries) 
select 'Create login [' + su.name + '] with password ' + su.password 
FROM sys.sysusers su 

Insert into tempUsers(Queries) 
select 'Create user [' + su.name + '] for login [' + su.password + ']' 
FROM sys.sysusers su 

Insert into tempUsers(Queries) 
select 'GRANT ' + dp.permission_name collate latin1_general_cs_as 
+ ' ON ' + s.name + '.' + o.name + ' TO ' + '[' + dpr.name + ']' 
FROM sys.database_permissions AS dp 
    INNER JOIN sys.objects AS o ON dp.major_id=o.object_id 
    INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id 
    INNER JOIN sys.database_principals AS dpr ON dp.grantee_principal_id=dpr.principal_id 
where o.type = 'U' 

declare @count int, @max int, @query Varchar(255) 
set @count =1 
set @max = (Select max(ID) from tempUsers) 
set @query = (Select Queries from tempUsers where ID = @count) 

while(@count < @max) 
begin 
print(@query) 
set @count += 1 
set @query = (Select Queries from tempUsers where ID = @count) 
end