2013-09-27 80 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