我正在尝试撤销一组表上数据库中几乎每个用户对某些列的访问权限。我理解撤销权限,但从我所看到的来看,这是在表/架构级别。我会怎么做类似的事情:
REVOKE ALL PRIVILEGES on schema.table.column from 'jeffrey'@'localhost';
参见https://dev.mysql.com/doc/refman/8.0/en/grant.html:
用户对数据库、表、列或例程拥有的权限是由每个权限级别(包括全局级别)的帐户权限的逻辑“或”相加形成的。不可能因为较低级别没有该特权而拒绝较高级别授予的特权。
这意味着您可以向单个命名列授予权限,但不能向整个表授予权限,然后尝试撤销某些列的权限。整个表的权限仍然适用于该用户。
考虑此问题的另一种方式是,您无法以比您授予的更细的粒度撤销特权。
解决方法是不在表级别授予,而仅在列级别授予。例如,如果您希望用户访问 col1、col2、col6,但不能访问其他列:
GRANT SELECT (col1, col2, col6) ON mydb.mytbl TO 'someuser'@'somehost';
如果您想要授予访问权限的列列表很长,那就这样吧。可能会不方便,但这就是它的工作原理。
另一种解决方法是不授予该表任何权限,但按照 Barmar 在评论中建议的方式创建视图。视图的定义者对基表具有权限,但视图仅公开某些列。然后您向您的用户授予对该视图的访问权限。