![如何将对数据库拥有所有权限的 mysql 用户更改为仅对一个特定表拥有选择权限?](https://linux22.com/image/536259/%E5%A6%82%E4%BD%95%E5%B0%86%E5%AF%B9%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8B%A5%E6%9C%89%E6%89%80%E6%9C%89%E6%9D%83%E9%99%90%E7%9A%84%20mysql%20%E7%94%A8%E6%88%B7%E6%9B%B4%E6%94%B9%E4%B8%BA%E4%BB%85%E5%AF%B9%E4%B8%80%E4%B8%AA%E7%89%B9%E5%AE%9A%E8%A1%A8%E6%8B%A5%E6%9C%89%E9%80%89%E6%8B%A9%E6%9D%83%E9%99%90%EF%BC%9F.png)
我为我的 mysql 用户授予了“授予 my_user@localhost 的所有数据库名称权限”的权限。现在我想更细致地处理,首先降低特定表的权限。
我希望 mysql 具有或可以设置为遵循“最少权限”策略,这样我就可以保留当前设置并降低一个表的权限。但我在文档或网上没有看到类似的东西。
除了删除数据库级别的授予并在表级别重新授予之外,是否有办法通过添加另一条规则来获得相同的结果?
答案1
MySQL 中的所有权限都是加性的;没有减性权限的概念。
您必须删除GRANT ALL ON db.* ...
并分配您想要的细粒度表级权限。
请记住,你有一个非常广泛的特权MySQL 中可供您使用。也许您可以从为GRANT SELECT
您的用户提供只读访问权限的数据库级别开始。然后,您可以根据需要有选择地按表添加破坏性权限。
答案2
不幸的是,如果用户已经具有数据库级权限,则运行revoke all on db.table from user@host;
不会为您创建所有现有的表级权限(您要撤销的权限除外)。
我能想到的最好的方法是向用户添加所需的所有表级权限,然后撤销数据库级权限。
mysql
MySQL根据权限的上下文将其权限保存在数据库的不同表中。
- 如果您授予权限,
*.*
它将进入mysql.User
表中。 - 如果您授予权限,
db.*
它将进入mysql.db
表中。 - 如果您授予权限,
db.table
它将进入mysql.tables_priv
表中。 - 如果您授予列权限,
db.table
它将进入mysql.columns_priv
表中。
因此,运行下面的最终撤销只会从表中删除条目db
并保留表中所已有的所有内容tables_priv
。
例如:用户已经拥有这个:
mysql> grant all on db.* to user@host;
你运行这个:
mysql> grant all on db.table1 to user@host;
mysql> grant all on db.table2 to user@host;
mysql> grant all on db.table3 to user@host;
mysql> grant all on db.table4 to user@host;
mysql> revoke all on db.* from user@host;
在您运行撤销命令之前,用户将一直可以访问db.table5
。撤销之前和之后,用户都可以访问其他四个表。
例外情况(总是有例外)是列权限。如果您将列权限授予已拥有同一表的表级权限的用户,这些权限将存在于表中,columns_priv
但不会显示在show grants
命令中,并且如果您运行命令,这些权限将消失revoke ... on db.table from user@host;
。
您应该能够编写脚本来添加所有表级权限,而不是手动创建它们。