如何创建只能访问一个数据库中一个模式的登录名和用户

Mar*_*man 5 schema sql-server permissions sql-server-2012 logins

我执行了以下操作:

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];
Run Code Online (Sandbox Code Playgroud)

(我没有授予任何角色,因为我不希望此登录名能够访问此数据库中的任何其他架构。)

我以 MyDomain\MyAccount 的身份运行 SSMS(以不同的用户身份运行)。然后我尝试连接到这个实例。但是,我得到:

无法打开用户默认数据库。登录失败。用户
“MyDomain\MyAccount”登录失败。(Microsoft SQL Server,错误:4064)

如果我在连接属性中将默认数据库设置为 MyDatabase,我会得到相同的结果。

我运行了 Profiler 跟踪并看到错误 18456 状态 38:

用户“MyDomain\MyAccount”登录失败。原因:无法打开明确指定的数据库“MyDatabase”。[客户:MyIpAddress]

接下来是错误 18456 状态 40:

用户“MyDomain\MyAccount”登录失败。原因:无法打开登录属性中指定的数据库“MyDatabase”。[客户:MyIpAddress]

MyDatabase 在线,我可以使用其他登录名轻松连接到它。我需要向 MyDomain\MyAccount 授予哪些额外权限?还有什么我想念的吗?

Ken*_*her 3

猜测您缺少连接权限。我一直认为它是由用户创建的,但可能在某些情况下不会添加它。

尝试跑步

USE [MyDatabase];
GO
GRANT CONNECT TO [MyDomain\MyAccount];
Run Code Online (Sandbox Code Playgroud)

您还可以尝试更改 [MyDomain\MyAccount] 的默认架构

ALTER USER [MyDomain\MyAccount] WITH DEFAULT_SCHEMA = MySchema;
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用我的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
Run Code Online (Sandbox Code Playgroud)

  • 授予连接到 [MyDomain\MyAccount] 的权限;解决了它。显然,在这种情况下,这并没有被自动授予。谢谢! (2认同)