为何数据库所有者在同一数据库中部分Schema的表授权失败?
针对Schema授权失败的排查方向
你遇到的“No privileges were granted for ”错误,核心原因是执行授权的用户没有权限操作dm schema下的表
先查dm表的实际所有者
数据库owner不等于schema下所有表的owner,执行这条SQL对比两个schema的表归属:SELECT schemaname, tablename, tableowner FROM pg_tables WHERE schemaname IN ('dm', 'plus');如果dm下的表owner不是当前执行授权的用户(比如是其他角色创建的),你作为数据库owner也没权限直接给别人授这些表的权限。解决办法要么把表的所有权转到自己名下:
-- 单表转移示例 ALTER TABLE dm.your_table OWNER TO current_user;要么批量转移所有dm下的表:
DO $$ DECLARE rec RECORD; BEGIN FOR rec IN SELECT tablename FROM pg_tables WHERE schemaname = 'dm' LOOP EXECUTE 'ALTER TABLE dm.' || quote_ident(rec.tablename) || ' OWNER TO current_user'; END LOOP; END $$;转移后再执行授权语句应该就能成功。
检查是否有遗漏的权限撤销操作
确认下有没有针对当前用户的、关于dm表的权限撤销命令,比如之前执行过REVOKE ALL ON TABLE dm.* FROM current_user;,这会让你失去对这些表的授权能力。可以用这条SQL查看当前用户对dm表的权限:SELECT nspname, relname, privtype FROM pg_privileges WHERE grantor = current_user AND nspname = 'dm';排查Neon平台的特殊限制
作为Serverless PG平台,Neon可能有特殊的权限隔离。比如dm schema是不是通过分支复制、备份恢复创建的?这种情况下表的权限会保留原始归属,导致你作为数据库owner也没法操作。可以试试重新创建dm schema并迁移数据,或者联系Neon客服确认有没有平台层面的限制。单表测试定位问题
先针对dm下某一张表单独执行授权:GRANT SELECT ON dm.single_table TO datamart_pg_reader;如果还是失败,查这张表的详细权限:
SELECT * FROM pg_class JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid WHERE nspname = 'dm' AND relname = 'single_table'; SELECT * FROM pg_privileges WHERE grantee = 'datamart_pg_reader' AND tablename = 'single_table';能帮你更精准定位问题。
内容的提问来源于stack exchange,提问作者Byofuel
相关产品推荐
相关产品推荐

