2011-11-17 61 views
2

我有一個SQL 2005 Express數據庫,在我的開發機器上配置了用於Windows身份驗證的安全性。有時我需要將其複製到使用SQL身份驗證的SQL 2008 R2測試服務器。我嘗試在測試服務器上分離並附加開發副本,並在測試服務器上恢復開發備份,但在這兩種情況下,以前配置的SQL帳戶的角色成員身份和權限均已丟失,我必須重新配置他們。T-SQL - 如何複製數據庫並保持安全設置不變?

有沒有辦法將數據庫複製到測試服務器,並在還原/附加後保持現有的SQL用戶安全配置不變?

謝謝!

回答

2

當然: SSMS GUI有一種快速的方法來複制用戶:,任務,生成腳本....,選擇「用戶」。

這裏的另一種選擇:

http://support.microsoft.com/default.aspx?scid=kb;en-us;246133

+0

謝謝,但這些方法似乎只是複製登錄。當我運行生成的腳本時,角色成員身份和權限不會保持不變。 –

+0

再次看:http://support.microsoft.com/kb/246133 – paulsm4

+0

這工作。通過運行該文章中的proc生成的腳本允許我在開發機器上創建具有相同SID的用戶。我錯過的是,我必須在備份之前設置角色成員和權限,並將數據庫複製到測試服務器。謝謝! –

4

您可能會遇到被稱爲 「孤立用戶」,which is discussed in this Mircosoft article問題。

基本上,用戶存在於數據庫中,並且服務器上存在登錄名,但SPID不匹配,因此用戶在數據庫恢復或連接到服務器時未與登錄名關聯。

正如文章所討論的,sp_change_users_login存儲過程可以用來解決個人登錄和下面的腳本將嘗試自動解決所有數據庫中的用戶:

IF EXISTS(SELECT * FROM tempdb..sysobjects WHERE id = object_id('tempdb..#t_users')) 
    drop table #t_users 

CREATE TABLE #t_users ([name] SYSNAME) 

INSERT #t_users ([name]) 
SELECT [name] 
FROM sysusers 
WHERE 
    islogin = 1 
    AND name NOT IN ('dbo', 'public', 'guest', 'sys', 'INFORMATION_SCHEMA') 
order by name 

DECLARE @lc_name SYSNAME 

SET @lc_name = (SELECT MIN([name]) FROM #t_users) 
WHILE @lc_name IS NOT NULL 
BEGIN 
    IF EXISTS(SELECT * FROM master..syslogins WHERE [name] = @lc_name) 
    BEGIN 
     EXEC sp_change_users_login 'AUTO_FIX', @lc_name 
     PRINT 'fixing ' + @lc_name 
    END 
    ELSE 
     PRINT '*** not fixing ' + @lc_name 

    SET @lc_name = (SELECT MIN([name]) FROM #t_users WHERE [name] > @lc_name) 
END 
+0

顯然,測試服務器上的SQL用戶帳戶不被視爲孤立的; 'sp_change_users_login @ Action ='報告'顯示沒有結果。 –

+0

@邁克爾弗雷德裏克森 - 好的電話。 「sp_change_users_login'Auto_Fix'」/孤立用戶是我經常遇到的常見問題 - 這絕對是值得記住的事情。 – paulsm4