Security

將數據庫移動到新伺服器

  • May 30, 2012

我正在將生產數據庫的備份恢復到****新伺服器。新伺服器還託管使用數據庫的應用程序。因此,我想使用相同的使用者/密碼組合來連接到數據庫。使用者也包含在數據庫備份中,所以我認為應該可以。但是,該使用者在新伺服器上不作為(數據庫)使用者存在。所以我創建了一個新的伺服器使用者並嘗試將此憑據映射到新恢復的數據庫。但是,這失敗了,因為user already exists在數據庫中。

是否可以(如果可以,請告訴我如何)將使用者從數據庫(獨立於伺服器)移動/複製到(數據庫)伺服器登錄列表?

在 SQL-Server 2008 中,用於恢復數據庫的數據庫使用者和伺服器登錄可能不同步,因為內部 ID 不匹配。要修復此執行:

EXEC sp_change_users_login @Action=‘‘Update_One’’, @UserNamePattern=‘databaseusername’, @LoginName = ’logonname’;

針對您恢復的數據庫和每個使用者/登錄。

在 SQL-Server 2012 中,有一個新選項可以使用獨立於伺服器登錄的數據庫使用者。

我知道我遲到了,但這可能對其他人有幫助。

登錄是在伺服器級別。使用者處於數據庫級別。有一個 ID 值(稱為 SID)將兩者連接在一起。在新伺服器上創建 SQL 登錄時,SQL 會選擇一個新的 SID 值。SID-picking 算法的本質是你不會在兩個不同的伺服器上得到相同的值。從舊伺服器還原數據庫時,數據庫中的 SID 值與伺服器上的 SID 值不匹配。

此時,您想使用 sp_change_users_login。

但是,在您到達那一點之前,您可以避免很多麻煩,特別是如果您有登錄日誌以從舊伺服器遷移到新伺服器。查看 sp_help_revlogin。這是 Microsoft 支持的過程。proc 和文件位於此處此處。(不同版本的 SQL Server 有不同版本的過程。還有一個名為“sp_hexadecimal”的輔助函式。)基本上,您需要在舊伺服器上創建這些過程,然後執行它們。知識庫文章有詳細資訊。

sp_help_revlogin 的最大優勢在於它生成的使用者創建 DDL 保留了 SQL 登錄的 ID 值和密碼。這樣,您只需執行 sp_help_revlogin,查看生成的 DDL 以找到您需要的使用者,在新伺服器上執行該程式碼,然後恢復數據庫。此時,SID 值應該匹配並且您不需要 sp_change_users_login。

解決此問題的另一種方法是使用集成(也稱為“域”或“Windows”)安全性。使用 AD 登錄時,會在您創建登錄時從域中提取 SID 值。然後,當您為該登錄創建數據庫使用者時,該 SID 值將被放置在數據庫中。由於 SID 值只有一個來源,因此不會發生不匹配。當然,使用集成安全性並不總是可行的。

引用自:https://serverfault.com/questions/394025