我怎样才能更改我的MySQL数据库上的所有权限的用户只有一个特定的表上select特权?

我给我的MySQL用户“授予所有特权在database_name。*到my_user @ localhost”处理。 现在我想要更细化,首先要降低特定表的权限

我希望MySQL已经或可以设置为“最低权限”的政策,所以我可以保持当前的设置,并降低它的一个表。 但是在文档或者在线上我还没有看到类似的东西。

除了删除数据库级别授予和重新授予表级别,有没有办法通过添加另一个规则来获得相同的结果?

MySQL中的所有权限都是加法的; 没有减法特权的概念。

您必须删除GRANT ALL ON db.* ...并分配您希望的粒度表级权限。

请记住,你有一个非常广泛的 MySQL 权限可供你使用。 也许你可以从数据库级别的GRANT SELECT ,它将为用户提供只读访问权限。 然后,您可以按照您的需要,根据每个表select性地添加破坏性特权。

不幸的是,如果一个用户已经拥有数据库级别的权限,那么运行revoke all on db.table from user@host;revoke all on db.table from user@host; 不会为您创build所有现有的表级特权(除了您正在撤销的特权)。

我能想到的最好的方法是将所需的所有表级特权添加到用户,然后撤销数据库级特权。

MySQL根据特权所针对的上下文,将其权限保存在mysql数据库的不同表中。

  • 如果你授予*.*的特权,它将进入mysql.User表。
  • 如果你授予db.*的特权,它将进入mysql.db表。
  • 如果你授予db.table的特权,它将进入mysql.tables_priv表。
  • 如果你授予db.table列权限,它将进入mysql.columns_priv表。

因此,运行下面的最终撤消操作只会从db表中删除条目,并将所有已经存在于tables_priv表中的内容都保留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; ,它将消失revoke ... on db.table from user@host; 命令。

您应该能够脚本添加所有表级别的权限,而不是手动创build它们。