選單
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
2 分鐘閱讀時間 (434 個字)

資料庫備份還原到另一個-sql-server-後,帳號無法使用

資料庫備份還原到另一個-sql-server-後,帳號無法使用

問題發生狀況

要將正式機的資料倒到測試機作為測試資料使用
並使用備份還原的方式
還原後發現測試機的db帳號登入後無權限使用此db

舉例來說
在正式機的 SQL Server 有個 accout_test 帳號,且此帳號有 XXDB 的存取權限
測試機 SQL Server 一樣也有個 accout_test 帳號
db還原後,直覺上測試機的 accout_test 應該會有 XXDB 的存取權限

但實際上會出現錯誤 "伺服器主體 "accout_test" 在目前的安全性內容下無法存取資料庫 "Northwind"。" 

應急解決方式

當時應急是先將 XXDB 上的登入移除此帳號,再重新加帳號的存取權限,發現這樣子就可以!
但如果帳號的數量一多,也需要花費不少功夫才能將所有帳號的權限重建回來

後來想到這個問題再回去找資料的時候
發現原來是因為在建立一個 User 時 SQL Server 會建立新的 SID (安全性識別碼)
當登入時,SQL Server 會去比對帳號的 SID,若一致才允許登入
所以每個 SQL Server 即使建立同名稱的帳號,SID 也是不同的
而還原到新 Server 的 DB 他的登入 User SID 仍然還是舊 Server 的 SID,並不會因為還原到新 SQL Server 上時 SID 就有所不同,如果真的這樣的話可能會照成世界大亂! Xd

更好的解決方式

  1. sp_change_users_login
    此SP可搭配參數使用,可點上面連結看詳細說明
    第一個參數為@Action,若要修復帳號 SID 可搭配 'Auto_Fix' 或 'Update_One'使用
    Auto_Fix:主要是若有相同名稱的帳號就可以自動修復
    Update_One:則必須指定對應的帳號名稱

    ```
    USE XXDB
    GO
    EXEC sp_change_users_login 'Auto_Fix', 'accout_test'
    --或
    EXEC sp_change_users_login 'Update_One', 'accout_test', 'accout_test';
    ```
    不過官網有提到此方法之後會移除,所以可參考下面第二點
  2. ALTER USER
    使用此方式可以修改登入USER的名稱或變更其預設結構描述
    在這個狀況下我們可以用LOGIN,去更正不相符的 SID
    ```
    USE XXDB
    GO
    ALTER USER accout_test
    WITH LOGIN = accout_test;
    ```
執行完上面其中一種語法後,再用帳號登入測試機XXDB,就可以正常登入了!
心靈成長-"思考的框架"摘要分享 #中篇
使用d3.js來繪製地圖

相關文章

 

評論

尚無評論
已經注冊了? 這裡登入
Guest
2024/04/19, 週五

Captcha 圖像