sql - 查询序列时模式 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'
不起作用?
有没有更好的方法来完成整个操作?
解决方案
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';
推荐阅读
- java - 在 GCP 中按机器类型过滤
- node.js - `prefix ~/.npm-packages` 是否与 `prefix=${HOME}/.npm-packages` 相同
- javascript - 浏览器在用户提交表单之前擦除表单数据
- codenameone - 显示包含 PDF 链接的空白页
- javascript - 如何正确比较 javascript 中的两个图像?
- python-2.7 - with open(src, 'rb') as fsrc: IOError: [Errno 22] invalid mode ('rb') or filename:
- javascript - Node.js 数组到带有换行符的文本
- http - 授权标头
- python-3.x - 以下帮助语句中的“/”是什么意思:__init__(self, /, *args, **kwargs)?
- android - 将程序从旧的 Android Studio 版本迁移到新版本的正确方法是什么?