Sql-Server

為什麼使用者無權訪問數據庫?

  • December 15, 2017

我有一個使用者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_readonlysid= 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使用者 sid ls_readonly。保留所有權限。

如果您通過刪除它來重新創建使用者,一旦您刪除該使用者,授予它的所有權限都將被刪除,您需要重新授予它們。

引用自:https://dba.stackexchange.com/questions/193138