MySQL向数据库授予除一个表之外的所有权限

xzy*_*fer 27 mysql privileges grant user-permissions

我一直无法找到合理的解决方案来实现以下目标:

我希望有一个用户拥有数据库(或具有相同模式的一系列数据库)的所有权限,除了一个表,他们只有SELECT权限.

基本上我希望用户可以自由统治数据库但不能更新特定的表.

到目前为止,我已经尝试过,但无济于事:

  • 授予该数据库的所有权限(db_name.*),然后专门授予该所需表的select权限(希望它会覆盖"all",我知道这是愚蠢的).

  • 授予该数据库的所有权限(db_name.*),然后撤消插入,更新和删除.但是这产生了一个错误,表明db_name.table_name没有授权规则.

从我能够收集的内容来看,除了只读表之外,我必须单独授予数据库每个表的所有权限.

请有人告诉我有一个更简单的方法

注意:我正在运行MySQL 5.1.Ubuntu 10.04上的最新版本.

小智 36

我知道这是一个老帖子,但我想我会加入@tdammers问题让别人看.您还可以在information_schema.tables上执行SELECT CONCAT以创建grant命令,而不必编写单独的脚本.

首先撤消该db的所有权限:

REVOKE ALL PRIVILEGES ON db.* FROM user@localhost;  
Run Code Online (Sandbox Code Playgroud)

然后创建GRANT语句:

SELECT CONCAT("GRANT UPDATE ON db.", table_name, " TO user@localhost;")
FROM information_schema.TABLES
WHERE table_schema = "YourDB" AND table_name <> "table_to_skip";
Run Code Online (Sandbox Code Playgroud)

将结果复制并粘贴到MySQL客户端并运行它们.

  • 使用 `wildcard` 异常而不是使用 `AND table_name &lt;&gt;` 使用 `AND table_name NOT LIKE "%_something_%"` (2认同)

tda*_*ers 7

AFAIK,是的,您需要为每个表单独授予.但是,嘿,你那里有一台电脑.计算机非常适合为您自动执行重复性任务,那么为什么不制作执行以下操作的脚本:

  1. 获取数据库中所有表的列表(SHOW TABLES;)
  2. 对于列表中的每个项目,授予所有权限
  3. 撤消特殊表的权限

或者,或者:2.对于列表中的每个项目,检查它是否是特殊表格; 如果不是,则授予所有权限

我没有提供代码的原因是它可以用任何带有MySQL工具的脚本语言来完成,甚至是shell脚本; 使用你最舒服的东西.

  • 虽然此解决方案现在可以正常工作,但如果您要将表添加到数据库,则必须为新表添加每个用户的权限.似乎没有办法只在*上添加权限,但在特定的表上具有反权限. (5认同)