You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何撤销特定列的INSERT、UPDATE权限?UPDATE uid列权限失效排查

问题分析与解决办法

问题原因

你执行了REVOKE UPDATE (uid) ON test.persons FROM hasura;但仍能更新uid列,核心原因是:hasura用户可能被授予过test.persons表的全表UPDATE权限,而PostgreSQL中表级权限优先级高于列级权限——只要用户拥有表级UPDATE权限,列级的REVOKE操作无法限制用户更新指定列。

验证权限状态

先执行以下SQL确认hasura是否拥有全表UPDATE权限:

SELECT has_table_privilege('hasura', 'test.persons', 'UPDATE');

如果返回结果为t,则说明用户确实拥有全表UPDATE权限,这就是问题根源。

正确的权限设置步骤

  1. 先撤销全表的UPDATE权限(如果存在):
REVOKE UPDATE ON test.persons FROM hasura;
  1. 再授予仅指定列的UPDATE权限:
GRANT UPDATE (name, description) ON test.persons TO hasura;

验证结果

重新执行你的UPDATE语句:

UPDATE test.persons SET uid = gen_random_uuid() WHERE name = 'John Doe';

此时会返回权限错误,符合你预期的限制效果。

补充说明

PostgreSQL的权限逻辑中,表级权限会覆盖列级权限。只有当用户没有表级对应权限时,列级的授权/撤销才会生效。因此设置列级权限前,务必确保用户没有对应的表级权限。

内容的提问来源于stack exchange,提问作者alexanoid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:19:58