系统对象 return 错误的 GRANT
System objects return wrong GRANTs
我在 SQL Server 2008R 上发现了奇怪的错误或行为。我正在尝试为 1 个模式的角色授予 EXECUTE 权限。但是,当我查看系统对象时,我看到 EXECUTE 权限设置为 SYSTEM_TABLE sysallocunits。如果我授予任何其他模式的权限,那么一切都会顺利,并且权限会设置为该模式。
我使用以下查询
GRANT EXECUTE ON SCHEMA::Sync TO [app_TSSyncService_web_svc]
select princ.name
, princ.type_desc
, perm.permission_name
, perm.state_desc
, perm.class_desc
, object_name(perm.major_id)
from sys.database_principals princ
left join
sys.database_permissions perm
on perm.grantee_principal_id = princ.principal_id
WHERE princ.name = 'app_TSSyncService_web_svc'
我得到以下输出:
name type_desc permission_name state_desc class_desc (No column name)
app_TSSyncService_web_svc DATABASE_ROLE EXECUTE GRANT SCHEMA sysallocunits
当我为任何其他角色授予对此架构的权限时,也会发生同样的事情。
更新
刚刚发现我的架构具有相同的 object_id sysallocunits 有什么建议我如何重写查询以在不进行硬编码的情况下忽略它?
不,您的架构有一个 schema_id
恰好与 sysallocunits
的 object_id
具有相同的数值。
您的查询对于检查非对象的任何内容的权限是错误的;对于模式,您希望从 sys.database_permissions
to the schema_id
in sys.schemas
加入 major_id
,而不是假设它是一个 object_id
加入 sys.objects
。
我不会尝试在这里完全重写您的查询,因为我不知道您希望能够查询的权限是什么class(es)。
我在 SQL Server 2008R 上发现了奇怪的错误或行为。我正在尝试为 1 个模式的角色授予 EXECUTE 权限。但是,当我查看系统对象时,我看到 EXECUTE 权限设置为 SYSTEM_TABLE sysallocunits。如果我授予任何其他模式的权限,那么一切都会顺利,并且权限会设置为该模式。 我使用以下查询
GRANT EXECUTE ON SCHEMA::Sync TO [app_TSSyncService_web_svc]
select princ.name
, princ.type_desc
, perm.permission_name
, perm.state_desc
, perm.class_desc
, object_name(perm.major_id)
from sys.database_principals princ
left join
sys.database_permissions perm
on perm.grantee_principal_id = princ.principal_id
WHERE princ.name = 'app_TSSyncService_web_svc'
我得到以下输出:
name type_desc permission_name state_desc class_desc (No column name)
app_TSSyncService_web_svc DATABASE_ROLE EXECUTE GRANT SCHEMA sysallocunits
当我为任何其他角色授予对此架构的权限时,也会发生同样的事情。
更新 刚刚发现我的架构具有相同的 object_id sysallocunits 有什么建议我如何重写查询以在不进行硬编码的情况下忽略它?
不,您的架构有一个 schema_id
恰好与 sysallocunits
的 object_id
具有相同的数值。
您的查询对于检查非对象的任何内容的权限是错误的;对于模式,您希望从 sys.database_permissions
to the schema_id
in sys.schemas
加入 major_id
,而不是假设它是一个 object_id
加入 sys.objects
。
我不会尝试在这里完全重写您的查询,因为我不知道您希望能够查询的权限是什么class(es)。