介紹 sp_change_users_login 的使用方式
才想說好一陣子不知道要寫甚麼,朋友就打電話來詢問一個問題,就順手整理一下當成一篇文章來提醒自己囉,也把處理方式整理一下,免得日後忘記。
狀況是這樣的,朋友之前有個 SQL Server 2000 和 SQL 的資料庫,這個實在是太古董的環境,因此想說該把它升級到 SQL Server 2017 上面。但比較麻煩的是因為原本的 OS 沒有辦法再去安裝那麼新的 SQL Server,因此需要異定升級的方式,中間要先在 Windows 2008 上將資料庫升級到 SQL Server 2005 和 SQL Server 2012,最後再升級到 Windows Server 2017 上的 SQL Server 2017。
原本升級應該沒有太多的麻煩,就是把資料庫卸離然後掛到新的版本資料庫,這樣持續反覆升級到最新的版本上面,看起來是一個簡單任務,花不到太多時間就可以完成了。但真正開始測試的時候,發現要升級的資料庫內都有建立使用者,也都設定好複雜的權限,但升級過程中在原本的主機上沒有先將帳號轉出,導致到新的主機上面,雖然有新建立帳號,但變成跟資料庫的使用者 SID 沒有辦法對應,導致帳號無法使用的問題。
在下面的例子中,我模擬一下朋友的環境,在一台電腦上將資料庫卸離,並且當檔案複製到新的主機上去掛載起來,此時在資料庫下面的使用者,就會如下圖中所呈現的,是沒有辦法對應到系統的帳號。
此時我們該如何處理呢 ? 首先我們可以先用一個系統的預存程序 sp_change_users_login 並搭配 Report 的參數來做檢查,此時會如下圖所示,會看到出現有個 mis 的帳號是無法對應的
此時我們依然是使用這個預存程序,但是搭配 Update_One 的參數,後面接上資料庫的使用者名稱和系統的登入帳號
當這樣執行之後,我們重新查看原本的那個 mis 的使用者名稱,就會看到如我們所期望的,已經正確的對應到登入帳號 xyz
上述的方式算是亡羊補牢的方法,如果原本的資料庫主機還在的狀況下,是可以參考另外一篇文章,把原本的 SID 給記錄下來,在建立使用者帳號的指定 SID ,這樣也就不用那麼辛苦轉換了。