如何授予除一个外的所有列权限?

4

我想授予用户“更新”权限来更新除一个列 - 在我的情况下是 Id 之外的所有列(更改 Id 可能会使数据、现有 URL 等混乱 - 外键不是解决办法)。在 mysql 中是否可以不列出所有其他列而实现此目的?例如,通过以下方式:

GRANT UPDATE (column_name1, column_name2, ...) ON table_name TO user_name;
grant update on db.table to user;
NOT grant update id on db.table to user;

还有类似的东西吗?

我不想列出所有列的原因:

  1. 更加健壮 - 我经常在表中添加一些列,我可能会忘记我必须更新这个规则,

  2. 我没有grant权限,所以我必须要求我的托管提供商运行每个grant命令,因此我希望尽量减少这些请求,因为这是一项超标服务(这是他们对我的恩典)。

特别是对于mysql,但我也对通用sql解决方案感兴趣。


1
很遗憾,无法按照您想要的方式完成。 - kapa
5个回答

2
您应该更多地了解数据库完整性,特别是外键
外键是关系型数据库系统保持完整性的方式,没有人为干预。从MySQL FK文档中可以看到:

"RESTRICT:拒绝父表的删除或更新操作。"

使用外键避免数据损坏有一些优点
  • 它是内置功能:性能比触发器或其他系统更好。
  • 这是标准的做法:其他开发人员可以理解你在做什么。
  • 报告解决方案和其他应用程序可以了解数据库字典中的关系。
由于OP的评论进行了编辑 无法授予高级别对象权限,然后撤销低级别对象权限,请参阅 MySQL中的选择性权限(并投票支持答案)。
这意味着您应该授予表的插入权限,所有字段的选择权限以及仅限于非ID字段的更新权限。您可以编写一个脚本来为您执行此操作。
我希望这最终回答了您的问题。

你们肯定都听说过“数据库一致性”这个词汇,然后就会自动联想到外键。但是外键怎么解决这个问题呢?1) 并不一定需要外键;id的一致性其实只取决于它们不发生变化;2) 外键并不能阻止用户将id更改为另一个有效值,但这仍会造成混乱。 - Tomas
@TOmas:你说外键不是解决方案,但你也说“更改ID可能会在数据、现有URL等方面造成混乱”。为什么?更改ID怎么会引起这样的麻烦? - ypercubeᵀᴹ
@ypercube,为什么更改ID是不好的并且永远不应该发生,这难道不清楚吗?http://stackoverflow.com/a/7860111/684229 - Tomas
@danihp,你的解决方案并不是我的问题的答案,因为将id定义为外键并不能防止用户更改它。 - Tomas

1

我猜这可能会起作用:

revoke update (id) on db.table from user;

我现在无法测试,但如果show grants也显示撤销命令,那将会很有趣。 - Tomas
那不起作用。如果执行了grant update on db.table from user(授予所有列的权限),则您将拥有所有列的更新权限。您的建议不会从所有列授予中删除任何权限。只有在授权特定列时才有效:grant update(id,name,other) on db.table from user - Steve Chavez
为了使此类型的撤销工作,您应该首先启用partial_revokes,并且您应该具有最低版本的mysql,如此处所述:https://dev59.com/_l3Ua4cB1Zd3GeqP-jxr#63481197。 - Tommy Bravo

1

无法实现 - 更多细节请参见此问题


1

据我所知,如果你担心数据库一致性问题,就应该使用外键约束来保持数据库的一致性。但是我认为这是不可能的。


  1. 并不一定需要外键;ID的一致性只是它们不会改变的简单事实。
  2. 外键不会阻止用户将ID更改为另一个有效的ID,但这仍然会造成混乱。
- Tomas
@Tomas 如果您不提供更改ID的功能,用户如何更改ID呢? - xdazz

1

创建存储过程来执行(选择、插入、更新、删除)数据操作。

仅将存储过程授权给用户,而不是表格。


谢谢。这个能在ODBC上工作并且可以用Microsoft Access访问吗?那就是用户要做的事情。恐怕不行,所以我想使用尽可能简单的方法... - Tomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接