ENIX.DQ 發表於 2012-6-5 10:04:03

INF:如何解決在 SQL Server 之間移動資料庫的權限問題

當您將資料庫從一個 SQL Server 伺服器移至另一個 SQL Server 伺服器時,master 資料庫中的登入與 user 資料庫中的安全識別碼 (SID) 可能會不相符。根據預設,SQL Server 7.0、SQL Server 2000 和 SQL Server 2005 會提供 sp_change_users_login 系統預存程序來對應這些不相符的使用者。然而,您只能使用 sp_change_users_login 預存程序來對應標準的 SQL Server 登入,而且一次只能對應一名使用者。如需有關 sp_change_users_login 預存程序的詳細資訊,請參閱《SQL Server 7.0 線上叢書》、《SQL Server 2000 線上叢書》和《SQL Server 2005 線上叢書》中的〈sp_change_users_login〉主題。

在 SQL Server 7.0 或更新的版本中,您可以使用 SID 來維護 master 資料庫中的登入以及 user 資料庫中的使用者之間的對應關係。為了維護 user 資料庫中登入的正確權限,您必須進行對應。如果遺失此對應,則登入便會發生下列或其他的權限問題:[*]如果新的伺服器上沒有 SQL Server 登入,則當使用者嘗試登入時,可能會收到下列錯誤訊息:Server:Msg 18456, Level 16, State 1 (伺服器:訊息 18456,層級 16,狀態 1)
Login failed for user '%ls'. (使用者 '%ls' 登入失敗)


[*]如果新的伺服器上有 SQL Server 登入,但 master 資料庫中的 SID 和 user 資料庫中的 SID 不相同,使用者可以成功登入 SQL Server;但是,當使用者嘗試存取資料庫時,可能會收到下列錯誤訊息:伺服器:Msg 916, Level 14, State 1, Line1 (伺服器:訊息 916,層級 14,狀態 1,行 1)
Server user '%.*ls' is not a valid user in database '%.*ls'. (伺服器使用者 '%.*ls' 並非資料庫 '%.*ls' 的有效使用者)


注意 在 SQL Server 2005 中,使用者可能會收到下列錯誤訊息:
Server user '%s' is not a valid user in database '%s'. (伺服器使用者 '%s' 並非資料庫 '%s' 的有效使用者)Add the user account into the database first. (請先將使用者帳戶新增至資料庫)


如需有關 SQL Server 7.0 安全性模型的詳細資訊,請參閱《Microsoft SQL Server 7.0 Security》白皮書。如果要檢視此白皮書,請造訪下列的 Microsoft 網站:http://msdn2.microsoft.com/en-us/library/Aa226173(SQL.70).aspx

如需有關 SQL Server 2000 安全性模型的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:322712Microsoft SQL Server 2000 SP3 Security Features and Best Practices

http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/uparrow.gif回此頁最上方
限制[*]如果 sysusers 資料表中有使用者沒有以擁有物件的電腦名稱或網域名稱做為前置詞,而這些物件在應用程式中是使用 username.objectname 這種兩段式名稱來參照的,則應用程式可能會中斷,因為 sp_sidmap 預存程序會以電腦名稱或網域名稱做為前置詞,重新命名這些使用者,與在 sysxlogins 資料表中的顯示方式相同。如果要解決此問題,請在 sp_sidmap 預存程序完成後,重新命名 sysusers 資料表中受到影響的使用者,讓他們回復原本的名稱,或是連絡您的主要支援提供者。[*]本文並未將別名納入考量,您必須手動管理別名。[*]如果新的 SQL Server 伺服器上沒有標準的 SQL Server 登入,則您可以新增以 NULL 為密碼的登入。您可能必須個別變更這些登入的密碼。[*]如果使用者在 user 資料庫中的名稱與 sysxlogins 資料表中的名稱不同,就不可能知道與該使用者相對應的登入是哪一個。因此,在執行 sp_sidmap 預存程序之前,[*]請將此使用者擁有的所有物件傳送至預備資料庫。[*]刪除使用者後,再新增名稱正確的使用者,最後再將此使用者的所有物件傳送回來。[*]如果使用者沒有對應的登入,也沒有使用本機電腦名稱或網域名稱作為前置詞,您就會收到一則關於此使用者的訊息。這則訊息會指出您必須先在 Windows 層級新增此使用者,然後再以登入的形式將它新增至 SQL Server 中。完成上述作業之後,您必須再次執行sp_sidmap 預存程序。[*]如果使用者有使用網域名稱或本機 Windows 伺服器名稱作為前置詞,但在 sysxlogins 資料表中卻沒有對應的登入,則預存程序會試著將此使用者當做新的登入新增至 SQL Server 中。如果 Windows 使用者不存在,結果視窗中會產生一個輸出訊息,然後在首次新增 Windows 使用者後手動建立登入。[*]如果在 sysusers 資料表中的某位使用者具有多個登入,則您會在結果檔案中看見一則輸出訊息。此訊息會列出具有相同使用者名稱的所有登入。這時您必須手動進行調整,確保該名使用者只有一個相對應的登入。

範例 如果 sysusers 資料表中有一個名稱為 johndoe 的使用者,而 sysxlogins 資料表中有名稱為 Test\johndoe 與 Test2\johndoe 的登入,當您執行預存程序時,將會收到一則訊息,指出其中一名使用者具有多個登入,而「系統管理員」必須決定要使用哪一個登入。這是您唯一需要執行第二個預存程序 sp_prefix_sysusersname 的時機 (本文提供此預存程序的相關資訊)。此外,Readme.txt 檔中也會針對此一情況進行詳細說明。http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/uparrow.gif回此頁最上方
對應標準和整合登入在您將資料庫從一個執行 SQL Server 伺服器的伺服器移至另一個執行 SQL Server 伺服器的伺服器之後,請執行下列步驟,讓手動調整的情況降到最低:[*]確認資料庫的 sysusers 資料表中的每位使用者在 Master 資料庫的 sysxlogins 資料表中都有一筆登入。

注意 如果要新增標準 SQL Server 登入,請參閱《SQL Server 線上叢書》中的<sp_addlogin>主題。如果要新增整合 SQL Server 登入,請參閱《SQL Server 線上叢書》中的<sp_grantlogin>主題。[*]下載 MapSids.exe 檔案,再解壓縮 Sp_sidmap.sql 和 Readme.txt 檔案。[*]以系統管理員身分登入 SQL Server 伺服器,然後在使用者資料庫中執行 Sp_sidmap.sql 檔案。執行 Sp_sidmap.sql 檔案會建立兩個預存程序:sp_sidmap 和sp_prefix_sysusersname。[*]確認只有正在執行這兩個預存程序的使用者才能存取資料庫。[*]確認 視窗所顯示的結果是文字格式,而不是格線格式。如果要執行這項操作,請按 CTRL^T 鍵,或是按一下 [查詢],然後按 [以文字顯示結果]。這點很重要,因為這樣您才可以在同一個視窗中檢視結果和資訊訊息,並將輸出儲存為文字檔。稍後當您在解決一些對應問題時,可能會需要用到此輸出檔。[*]由於沒有任何方法可以確認參數是否已正確傳送,因此請務必以正確的方式將參數傳送至sp_sidmap 預存程序:EXEC sp_SidMap @old_domain = old_domain_name,@new_domain = new_domain_name,@old_server = old_server_name,@new_server = new_server_name

請視情況取代新舊網域名稱及伺服器名稱的值。[*]將結果儲存至檔案中,再依照 Readme.txt 檔案中的指示進行。

注意 當您在執行上述預存程序時,sysusers 資料表是資料庫中唯一發生變更的資料表。如果要返回開始時的狀態,請從備份還原資料庫,或是重新附加資料庫。http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/uparrow.gif回此頁最上方


参考如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:274188PRB:線上叢書的疑難排解孤兒使用者主題不完整
246133INF:在 SQL Server 7.0 與 SQL Server 2000 之間傳送登入和密碼
168001PRB:還原傾印之後發生使用者登入及 (或) 權限錯誤
298897SAMPLE:資料庫移動後,Mapsids.exe 可以協助對應使用者資料庫與 Master 資料庫之間的 SID
http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/uparrow.gif回此頁最上方


這篇文章中的資訊適用於:
http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/uparrow.gif回此頁最上方

關鍵字: kbsqldeveloper kbhowtomaster KB240872

http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/uparrow.gif回此頁最上方
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
頁: [1]
查看完整版本: INF:如何解決在 SQL Server 之間移動資料庫的權限問題