【问题标题】:Mysql override permission for a single tablemysql覆盖单表权限
【发布时间】:2019-08-24 20:06:38
【问题描述】:

我有一个包含 250 多个表的 Mysql 数据库,我需要阻止单个用户对其中一个表的删除权限。

我们已经尝试过授权,但是这个数据库有删除权限,所以单个表的授权查询没有生效,我仍然可以从这个表中删除行。我做到了:

GRANT SELECT, INSERT, UPDATE ON db.table TO 'user'@'host';

全局权限:

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER ON `db`.* TO 'user'@'host'  

有没有办法覆盖单个表的权限,或者我们必须删除全局权限并为每个表中的用户设置权限? 也许某种方式可以为除一个之外的所有 (*) 设置全局权限,以便第二次授权生效?

还尝试了@kiks73 帖子:

REVOKE DELETE ON db.table FROM 'user'@'host';

获取:

ERROR 1147 (42000): There is no such grant defined for user 'user' on host 'host' on table 'table'

但是有这个用户的全局权限集,包括这个表的删除权限。

谢谢

【问题讨论】:

标签: mysql permissions


【解决方案1】:

我认为您需要使用REVOKE 语句,因为您必须删除以前授予的权限:

REVOKE DELETE ON db.table FROM 'user'@'host';

更新

参考这个Super User Q&A,如果没有针对该用户在该表上撤销的特定授权,您应该尝试删除GRANT ALL ON db.* 并将授权分配给每个表上的每个用户,除了特定表上的特定用户,仅授予插入和更新权限。

如果你有 250 个表,你可以创建一个脚本结合这个 SQL 来获取用户创建的表的列表:

SELECT * from information_schema.tables 
WHERE table_schema not in ('information_schema', 'mysql', 'performance_schema')

和用户:

SELECT User FROM mysql.user;

使用您需要的授权创建一个 SQL 字符串。

【讨论】:

  • 获取:错误 1147 (42000):没有为表 'table' 上的主机 'host' 上的用户 'user' 定义这样的授权
  • 不幸的是,MySQL 不是这样工作的(你只能撤销给定的授权,mysql 中没有拒绝功能会禁止访问有授权的东西)。
  • 2 小时前刚刚为此目的编写了脚本,感谢您的帮助,将此答案保留为已获批准以在未来帮助他人 =D
猜你喜欢
  • 2020-12-02
  • 1970-01-01
  • 2018-12-21
  • 2021-03-16
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 2022-08-08
相关资源
最近更新 更多