当授予 SQL Server 中某个架构的权限时,我想拒绝某些用户的某些操作。我是否必须明确拒绝这些操作,或者当用户获得此架构的权限时,是否会自动拒绝其他用户对此架构的权限?
答案1
默认情况下,不会向用户授予架构中对象的权限。但是,用户可以通过几种方式获得对象的权限。例如,可以明确向用户和/或用户所属的组授予权限。
即使用户已被授予该对象的权限,该DENY
命令也会拒绝用户或组的权限。例如,假设用户 A 是 MyGroup 组的成员,并且该组已被授予访问 MyTable 表的权限。MyGroup 中的所有用户都可以查询 MyTable。现在,您可以拒绝用户 A 对 MyTable 的访问。用户 A 将无法查询 MyTable,但其余组成员仍可以查询该表。
因此,最好明确拒绝那些无权访问该模式的用户的权限。
答案2
将 SQL 中的 Schema 视为一棵树。用户越是向后追溯到模式的根部,就越是拥有允许的权限,沿着主干和分支,用户就越能保持该允许权限,直到您拒绝它为止。如果用户 A 有权在数据库上执行存储过程,那么他们就有权访问该数据库上的所有存储过程,如果您不希望他们有权运行单个存储过程,则必须将其标记为拒绝。读取、写入、更新等权限也是如此。如果用户在更高级别拥有这些权限,那么是的,您需要隐式拒绝。除非您首先授予用户访问权限,否则我想不出用户有权做的任何事情(包括登录)。当然,请记住,其中一些权限可能是在创建用户时授予的。
最后我想说的是,确保万无一失总是好的。我经常会指定允许或拒绝那些更安全敏感的项目,尽管我知道它本来就应该如此。