收到“对象的 SELECT 权限被拒绝”,即使它已被授予

Mas*_*iti 11 sql-server permissions sql-server-2008-r2

我是一名程序员,而不是一名 dba ……我知道足够危险。

我继承了一个旧用户的数据库,该用户是该数据库的 db_owner。出于业务原因,我们无法调整此用户对现有表、模式等的权限,但正在创建一些新表,我只希望此用户对它们具有 SELECT 访问权限。

已经为这些表为该用户设置了权限,因此除了 SELECT 设置为 GRANT 之外,所有内容都被拒绝。

然而,当此用户 (dbadmin) 尝试对这些表之一 (AccountingAudit) 执行 SELECT 时,会发生此错误:

The SELECT permission was denied on the object 'AccountingAudit', database 'billing', schema 'dbo'.
Run Code Online (Sandbox Code Playgroud)

我已运行此 SQL 以尝试查看为此表/用户设置的权限:

select object_name(major_id) as object,
 user_name(grantee_principal_id) as grantee,
 user_name(grantor_principal_id) as grantor,
 permission_name,
 state_desc
from sys.database_permissions
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

AccountingAudit dbadmin dbo ALTER   DENY
AccountingAudit dbadmin dbo CONTROL DENY
AccountingAudit dbadmin dbo DELETE  DENY
AccountingAudit dbadmin dbo INSERT  DENY
AccountingAudit dbadmin dbo REFERENCES  DENY
AccountingAudit dbadmin dbo SELECT  GRANT
AccountingAudit dbadmin dbo TAKE OWNERSHIP  DENY
AccountingAudit dbadmin dbo UPDATE  DENY
AccountingAudit dbadmin dbo VIEW DEFINITION DENY
AccountingAudit dbadmin dbo VIEW CHANGE TRACKING    DENY
Run Code Online (Sandbox Code Playgroud)

似乎它应该正常工作?

我正在进行的 SELECT 调用是一个非常基本的 SELECT * FROM AccountingAudit,来自 SSMS。我没有做任何特殊的 sp_executesql 或类似的事情。

我试过明确授予权限:

GRANT SELECT ON [dbo].AccountingAudit TO dbadmin
Run Code Online (Sandbox Code Playgroud)

这没有效果(为什么会这样,上面的查询已经表明它已被授予!;-)

我已经通过 stackoverflow.com 和其他地方进行了搜索,但找不到我尚未尝试过的任何内容。我想知道它是否与模式的设置方式有关。(此时我对模式知之甚少。)

有任何想法吗?谢谢!

Tho*_*ger 12

我不确定这里,但我要出去走走。我认为您的问题可能与您的DENY CONTROL记录有关。见这里大约一半时的页面:

拒绝对数据库的 CONTROL 权限隐式拒绝对数据库的 CONNECT 权限。被拒绝对数据库的 CONTROL 权限的主体将无法连接到该数据库。

我意识到这个例子是针对数据库的,但再细化一下。我猜DENY CONTROL桌子上的A将拒绝对其的所有特权。做一个REVOKE CONTROL摆脱它,看看是否能解决你的问题。

如果是这样,您必须将用户置于数据库角色中或拒绝他们对该表的显式权限。