数据库用户上的RED X是什么意思?


Answers:


21

这并不意味着该用户已被禁用(您只能禁用logins),这意味着该用户没有数据库的连接权限。我不确定您的用户是如何创建的,但是证明这一点的最简单方法是:

CREATE LOGIN u1 WITH PASSWORD = 'x', CHECK_POLICY = OFF;
GO
USE tempdb;
GO
CREATE USER u1 FROM LOGIN u1;
GO
ALTER LOGIN u1 DISABLE;
GO
-- u1 has no red x even though the login has been disabled

CREATE USER u2 WITHOUT LOGIN;
GO
-- check Object Explorer, u2 has no red x

DENY CONNECT TO u2;
GO
-- check Object Explorer, u2 now has a red x!

CREATE USER u3 WITHOUT LOGIN;
GO
-- check Object Explorer, u3 has no red x

REVOKE CONNECT FROM u3;
GO
-- check Object Explorer, u3 now has a red x!

GO由于缓存,您可能需要在命令之间刷新对象资源管理器。)

要修复此问题(假设您实际上希望他们能够连接到数据库):

GRANT CONNECT TO [DomainName\BI360Consultants];
GRANT CONNECT TO [DomainName\BI360Users];

当然,您需要根据数据库中需要执行的权限来应用更多权限。

可能还有其他更晦涩的方法进入此状态(例如,将域组添加到数据库中的角色而无需实际添加用户,如MichaelK的答案所述)。虽然老实说,当我尝试以旧方法或正确方法执行OP的操作时,如果没有用户在场,我无法将域组添加到角色中:

-- the old way
EXEC sys.sp_addrolemember N'db_datareader', N'[CAKE\MyGroup]';

消息15410,级别11,状态1,过程sp_addrolemember
用户或角色'[CAKE \ MyGroup]'在此数据库中不存在。

-- the right way
ALTER ROLE db_datareader ADD MEMBER [CAKE\MyGroup];

消息15151,级别16,状态1
无法添加主体'CAKE \ MyGroup',因为它不存在或您没有权限。

当然,有了这个结果,我在sysusers(不推荐使用;停止使用它)或中没有看到任何此类用户sys.database_principals。但是,如果我这样做(由于sepupic的回答):

GRANT SELECT ON dbo.SomeTable TO [CAKE\MyGroup];

然后,该用户确实出现在那些视图中,并且在对象资源管理器中确实以红色x出现在用户资源管理器中HAS_DBACCESS() = 0。这仍然大致相同:“无法访问数据库”。因此,如果上述方法GRANT CONNECT不起作用(在我的情况下,确实消除了红色的x,但我并未尝试以该帐户实际查询数据库),也请尝试以下操作,因为它可能会失败:

CREATE USER [DOMAIN\Group] FROM LOGIN [DOMAIN\Group];

就我而言,当我授予与该用户的连接时,它阻止了我运行CREATE USER命令:

消息15023,级别16,状态1,行16
用户,组或角色“ CAKE \ MyGroup”已存在于当前数据库中。

对于guest/ INFORMATION_SCHEMA/ sys-,此状态将始终为true,但某些系统数据库上的来宾帐户除外。忽略它,不要理会它们。


sp_addrolemember主题

在此处输入图片说明

sys.sysusers主题

在此处输入图片说明


这为我解决了。但是还必须存在其他一些潜在的问题-我的用户是通过脚本创建的,并且可以访问多个数据库。一个数据库上只有一个用户需要授予显式的“ CONNECT”权限。
Morvael

5

我只想补充亚伦·伯特兰(Aaron Bertrand)的答案,以确保这一点:

这意味着用户没有数据库的连接权限(您不能禁用用户,只能登录)。我不确定您的 用户是如何创建的 ...

Windows委托人只能通过以下方式发生这种情况:

Windows登录存在于服务器级别但不映射到有问题的数据库,有人决定grant/ deny在数据库级别的一些权限在此Windows主体。在这种情况下,将在数据库中创建相应的用户/架构,并将带有grant/ 的行deny写入sys.database_permissions。由于新创建的用户仍会错过该connect权限,因此不会授予对该数据库的任何访问权限,并且您会在OE中用红色箭头看到它。


谢谢,但是我们谈论的是红色的“ x”,而不是箭头。
Michael Kirkpatrick '18

这是Studio可视化的问题,但又是一回事
Sepupic

0

我想我知道为什么会发生。

场景:

Domain \ BI360Users是一个AD组

将Domain \ BI360Users作为登录名添加到服务器(它具有连接权限)

Domain \ BI360Users不作为数据库用户存在

我执行以下操作:

USE TEMPDB
GO
EXEC sp_addrolemember N'db_datareader', N'Doamin\BI360users'
GO

成功完成。

刷新:红色'x'出现。

在此处输入图片说明

用户未映射到数据库: 在此处输入图片说明

如果现在创建用户:

USE TempDB
GO
CREATE USER [Domain\BI360Users] FOR LOGIN [DOMAIN\BI360Users]
GO

红色的“ x”消失了: 在此处输入图片说明

因此,即使屏幕显示清楚地显示了上面的内容,也似乎没有用户。

这是来自sysusers的信息: 在此处输入图片说明


这就是我在谈论的内容,但是您在将Win组成功添加到数据库角色后,错误地认为“用户未映射到数据库”。与此同时,创建了对应的用户和架构。
sepupic

1
除了将域组添加到数据库角色之外,您还必须执行其他操作,因为这是行不通的(除非您使用的是SQL Server的较旧版本)。而且,即使在这种情况下GRANT CONNECT,正如我最初的回答所建议的,该问题也应该已经解决了。
亚伦·伯特兰

0

我有同样的问题。我通过在SQL Server数据库的“安全性/登录”部分的用户属性的“状态”部分中将“登录”状态更改为“已启用”来解决此问题 在此处输入图片说明

更改此状态后,红色标记消失。


-3

红色X表示在SQL Server中禁用了登录


谢谢。但是它们已启用。
Michael Kirkpatrick '18

无法禁用用户。
亚伦·伯特兰

该帐户是否存在于实例级别的Logins文件夹中?如果确实在相关数据库中运行命令“为登录名[YourLogin]创建用户[YourLogin]”,则在相关数据库中运行。红色X应该消失。
Goforebroke '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.