Sql-Server

如何創建只能訪問一個數據庫中的一個模式的登錄名和使用者

  • July 13, 2015

我已經執行了以下操作:

USE [MyDatabase];
GO
CREATE LOGIN [MyDomain\MyAccount] FROM WINDOWS WITH DEFAULT_DATABASE=[MyDatabase];
CREATE USER [MyDomain\MyAccount] FOR LOGIN [MyDomain\MyAccount];
GRANT EXECUTE   ON SCHEMA::[MySchema] TO [MyDomain\MyAccount];
GRANT SELECT    ON SCHEMA::[MySchema] TO [MyDomain\MyAccount];
GRANT INSERT    ON SCHEMA::[MySchema] TO [MyDomain\MyAccount];

(我沒有授予任何角色,因為我不希望此登錄名能夠訪問此數據庫中的任何其他模式。)

我以 MyDomain\MyAccount 身份執行 SSMS(以其他使用者身份執行)。然後我嘗試連接到這個實例。但是,我得到:

無法打開使用者預設數據庫。登錄失敗。

使用者“MyDomain\MyAccount”登錄失敗。(Microsoft SQL Server,錯誤:4064)

如果我在連接屬性中將預設數據庫設置為 MyDatabase,我會得到相同的結果。

我執行了 Profiler 跟踪並看到錯誤 18456 狀態 38:

使用者“MyDomain\MyAccount”登錄失敗。原因:無法打開明確指定的數據庫“MyDatabase”。

$$ CLIENT: MyIpAddress $$

隨後是錯誤 18456 狀態 40:

使用者“MyDomain\MyAccount”登錄失敗。原因:無法打開登錄屬性中指定的數據庫“MyDatabase”。

$$ CLIENT: MyIpAddress $$

MyDatabase 線上,我可以通過不同的登錄名輕鬆連接到它。我需要向 MyDomain\MyAccount 授予哪些額外權限?還有什麼我想念的嗎?

猜測您缺少連接權限。我一直認為這是與使用者一起創建的,但可能存在未添加的情況。

嘗試執行

USE [MyDatabase];
GO
GRANT CONNECT TO [MyDomain\MyAccount];

您也可以嘗試更改預設架構

$$ MyDomain\MyAccount $$

ALTER USER [MyDomain\MyAccount] WITH DEFAULT_SCHEMA = MySchema;

最後,您可以使用我的sp_dbpermissionssp_srvpermissions來查看使用者的權限。

EXEC sp_srvpermissions 'MyDomain\MyAccount'; -- Return instance level permissions
EXEC sp_dbpermissions 'All','MyDomain\MyAccount'; -- Return DB level permissions for all databases

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