如何撤销特定列的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权限,这就是问题根源。
正确的权限设置步骤
- 先撤销全表的UPDATE权限(如果存在):
REVOKE UPDATE ON test.persons FROM hasura;
- 再授予仅指定列的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
相关产品推荐
相关产品推荐

