Отказано в доступе для схемы pg_toast при запросе последовательностей - PullRequest
0 голосов
/ 08 января 2020

Цель состоит в том, чтобы получить таблицу и столбец, которые "используют" последовательность, и запрос, который я пришел, заключается в следующем:

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'?

Есть ли лучший способ выполнить всю эту операцию

1 Ответ

1 голос
/ 09 января 2020

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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...