首页 > 解决方案 > 查询序列时模式 pg_toast 的权限被拒绝

问题描述

目标是获取“使用”序列的表和列,我提出的查询是这样的:

select attrelid::regclass::text, attname 
from pg_attribute 
where pg_get_serial_sequence(attrelid::regclass::text, attname) = 'public.websession_idcntr_seq';

它效率低下,因此也欢迎任何其他建议,但手头的问题是这会因以下错误而中断:

ERROR:  permission denied for schema pg_toast

所以接下来我做的就是尽量避免使用 pg_toast:

select attrelid::regclass::text, attname 
from pg_attribute 
    join pg_class tbl on tbl.oid = pg_attribute.attrelid
    join pg_namespace nsp on tbl.relnamespace = nsp.oid
where 
    nsp.nspname != 'pg_toast'
    and pg_get_serial_sequence(attrelid::regclass::text, attname) = 'public.websession_idcntr_seq';

这也失败了,消息完全相同。

我无意对 pg_toast 模式做任何事情,我不能在超级用户帐户下运行它。(编辑:我无法修改权限来解决这个问题)。

为什么解决方法nspname != 'pg_toast'不起作用?

有没有更好的方法来完成整个操作?

标签: sqlpostgresqlschema

解决方案


SQL 不保证您WHERE评估子句中的条件的特定顺序,并且EXPLAIN会告诉您pg_get_serial_sequence(导致错误)首先执行。

尝试以下排除先前有问题的表的方法:

SELECT t.oid::regclass, a.attname
FROM pg_class AS t
   JOIN pg_attribute AS a ON t.oid = a.attrelid
WHERE t.relkind IN ('r', 'p')  /* only normal and partitioned tables */
  AND pg_get_serial_sequence(t.oid::regclass::text, attname)
      = 'public.websession_idcntr_seq';

推荐阅读