Answers:
这并不意味着该用户已被禁用(您只能禁用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,但某些系统数据库上的来宾帐户除外。忽略它,不要理会它们。
我只想补充亚伦·伯特兰(Aaron Bertrand)的答案,以确保这一点:
这意味着用户没有数据库的连接权限(您不能禁用用户,只能登录)。我不确定您的 用户是如何创建的 ...
Windows
委托人只能通过以下方式发生这种情况:
Windows
登录存在于服务器级别但不映射到有问题的数据库,有人决定grant
/ deny
在数据库级别的一些权限在此Windows主体。在这种情况下,将在数据库中创建相应的用户/架构,并将带有grant
/ 的行deny
写入sys.database_permissions
。由于新创建的用户仍会错过该connect
权限,因此不会授予对该数据库的任何访问权限,并且您会在OE中用红色箭头看到它。
我想我知道为什么会发生。
场景:
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
因此,即使屏幕显示清楚地显示了上面的内容,也似乎没有用户。
GRANT CONNECT
,正如我最初的回答所建议的,该问题也应该已经解决了。
红色X表示在SQL Server中禁用了登录