【发布时间】:2020-06-14 13:42:46
【问题描述】:
我创建了一个数据库级角色:NonBillingRole。
CREATE ROLE NonBillingRole
然后通过以下命令授予它所有访问权限并撤销/拒绝对帐单表的访问权限:
REVOKE SELECT, INSERT, UPDATE, DELETE ON TblBilling TO NonBillingRole
DENY SELECT, INSERT, UPDATE, DELETE ON TblBilling TO NonBillingRole
然后我已经为这个角色添加了一个用户。
如果我直接尝试选择或修改表 TblBilling,这可以正常工作。 但是用户可以通过任何存储过程来选择和修改表。
我的目标是创建一个角色,该角色具有对数据库的所有访问权限,包括执行存储过程,但对表 TblBilling 没有直接或间接访问权限(即使通过存储过程)。
【问题讨论】:
-
在存储过程和其他模块中使用对象时,如果对象具有相同的所有者(所有权链),则不会检查间接引用的对象的权限。这意味着您应该仅将存储过程的执行权限授予授权用户/角色。您可以分配不同的所有者(例如
ALTER AUTHORIZATION ON OJBECT::TblBilling TO BillingOwner)来中断链,但这需要将 TblBilling 表的直接权限授予授权用户。 -
在您的示例中添加无需使用
DENY,因为该角色没有任何授予的拒绝权限。
标签: sql-server roles sqlroleprovider