為什麼使用者無權訪問數據庫?
我有一個使用者
ls_readonly
應該db_datareader
對多個數據庫具有特權。我以為我設置正確:但是當我連接到伺服器
ls_readonly
並嘗試在對象資源管理器中打開數據庫時,出現錯誤:數據庫 wtest 不可訪問。(對象瀏覽器)
我打開一個查詢視窗
master
並嘗試執行:use wtest
這回應:
Msg 916, Level 14, State 1, Line 1 The server principal "ls_readonly" is not able to access the database "wtest" under the current security context.
我錯過了什麼?
**更新:**這是一個線索。如果我作為使用者從數據庫的安全上下文中刪除
ls_readonly
,然後我轉到伺服器安全上下文下的使用者並在“使用者映射”下授予對數據庫的訪問權限,然後它開始工作。可能是數據庫最初是從另一台伺服器恢復的,該伺服器也有一個
ls_readonly
使用者。我猜那麼使用者標識不是基於使用者名?
可能是數據庫最初是從另一台伺服器恢復的,該伺服器也有一個 ls_readonly 使用者。我猜那麼使用者標識不是基於使用者名?
通常情況下,所有登錄名都
sid
與相應的使用者相同。這就是CREATE USER FROM LOGIN
命令的意義:數據庫主體是使用與sid
相應登錄名相同的(安全標識符)創建的。該使用者
sid
現在儲存在您的數據庫中,並且當您backup
/restore
您的數據庫時,sid 也被保留。現在想像一下,您有 2 台伺服器,並且它們都已
ls_readonly
登錄。為簡單起見,在第一台伺服器ls_readonly
上sid
= 1,在第二台伺服器上sid
= 2。您擁有映射此登錄名的數據庫 MyDB。在第一台伺服器上 MyDB 儲存sid
= 1,在第二台伺服器上sid
= 2。您在第一台伺服器上備份 MyDB 數據庫並在第二台伺服器上恢復它。現在您的登錄
sid
名 = 2,在數據庫 MyDB 中sid
= 1。你登錄
ls_readonly
並嘗試訪問MyDB,伺服器正在檢查數據庫中是否有sid = 2,沒有,所以伺服器ls_readonly
根本沒有映射到MyDB。這可以通過做來解決
alter user ls_readonly with login = ls_readonly;
這個命令只是用登錄的 sid 更新數據庫的
ls_readonly
使用者 sidls_readonly
。保留所有權限。如果您通過刪除它來重新創建使用者,一旦您刪除該使用者,授予它的所有權限都將被刪除,您需要重新授予它們。