系统对象返回错误的GRANT

时间:2015-02-02 09:17:08

标签: sql-server sql-server-2008 sql-server-2008-r2 grant

我在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任何建议如何在不进行硬编码的情况下重写查询以忽略它?

1 个答案:

答案 0 :(得分:2)

不,您的架构的schema_id恰好与object_id的{​​{1}}具有相同的数值。

对于不是对象的任何内容,检查权限是错误的。对于架构,您希望sysallocunitssys.database_permissions加入sys.schemas中的major_id,而不是假设它是{{1}加入schema_id

我不会尝试在此处完全重写您的查询,因为我不知道您希望能够查询权限的类别。