授予权限后SSMS仍无法查看DatabaseA表的问题排查求助
问题分析:DatabaseA中myLogin无法查看表的可能原因
以下是针对该问题的具体排查方向和解决方案:
DatabaseA的用户映射异常
尽管执行了创建用户的语句,但可能存在登录名与数据库用户未正确绑定的情况。执行以下SQL验证映射状态:USE DatabaseA; SELECT name, login_name, type_desc FROM sys.database_principals WHERE name = 'myLogin';若返回结果中
login_name为空或不匹配目标Windows账户,需重新创建用户:USE DatabaseA; DROP USER IF EXISTS [myLogin]; CREATE USER [myLogin] FOR LOGIN [myLogin]; ALTER ROLE [db_datareader] ADD MEMBER [myLogin];表所在架构的权限被显式拒绝
db_datareader角色默认拥有所有架构表的SELECT权限,但如果表所属的自定义架构被给用户设置了DENY权限,会覆盖角色权限。执行以下SQL检查权限:USE DatabaseA; SELECT dp.name AS principal_name, COALESCE(o.name, s.name) AS object_or_schema, p.permission_name, p.state_desc FROM sys.database_permissions p JOIN sys.database_principals dp ON p.grantee_principal_id = dp.principal_id LEFT JOIN sys.objects o ON p.major_id = o.object_id LEFT JOIN sys.schemas s ON p.major_id = s.schema_id WHERE dp.name = 'myLogin' AND p.permission_name IN ('SELECT', 'VIEW DEFINITION');若存在
DENY状态的权限,需执行REVOKE DENY或重新授予对应权限。DatabaseA的guest账户被禁用
当用户无显式架构访问权时,依赖guest账户获取元数据的通道可能被切断。检查guest账户状态:USE DatabaseA; SELECT name, is_disabled FROM sys.database_principals WHERE name = 'guest';若
is_disabled为1,可启用guest账户(注意安全风险):USE DatabaseA; ALTER USER guest WITH LOGIN = guest;DatabaseA处于只读状态
只读数据库可能导致元数据加载异常。验证数据库状态:SELECT name, is_read_only FROM sys.databases WHERE name = 'DatabaseA';若
is_read_only为1,修改数据库状态:ALTER DATABASE DatabaseA SET READ_WRITE WITH ROLLBACK IMMEDIATE;Windows登录名的组权限冲突
myLogin所属的Windows组可能被拒绝访问DatabaseA。检查该登录名的数据库角色归属:USE DatabaseA; SELECT rp.name AS role_name, p.state_desc FROM sys.database_role_members drm JOIN sys.database_principals rp ON drm.role_principal_id = rp.principal_id JOIN sys.database_principals dp ON drm.member_principal_id = dp.principal_id JOIN sys.server_principals lg ON dp.sid = lg.sid WHERE lg.name = 'myLogin';若存在拒绝类角色权限,需调整组的权限配置。
SSMS显示选项限制
尝试右键DatabaseA选择刷新,或检查SSMS设置:- 打开
工具->选项 - 进入
SQL Server对象资源管理器->查看 - 确保
显示用户对象已勾选
- 打开
内容的提问来源于stack exchange,提问作者wilson_smyth
相关产品推荐
相关产品推荐

