PostgreSQL получает имя пользователя для блокировки и заблокированных пользователей - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь получить блокировку и заблокированные имена пользователей, но я получаю нулевой массив.

Вот что я пробовал:

select pid, 
   usename, 
   pg_blocking_pids(pid) as blocked_by, (select usename from 
pg_stat_activity where pid=ANY(pg_blocking_pids(pid)))
from pg_stat_activity
where cardinality(pg_blocking_pids(pid)) > 0;

Этот вложенный выбор возвращает [null].

Это то, что если я запрашиваю, чтобы выбрать вставку вручную значение pid, как это

select usename from pg_stat_activity where pid=ANY(pg_blocking_pids(14648));

Я получаю искомое значение.

1 Ответ

0 голосов
/ 19 марта 2019

Я думаю, что вам нужно условие корреляции:

select sa.pid, sa.usename, 
       pg_blocking_pids(sa.pid) as blocked_by,
       (select sa2.usename
        from pg_stat_activity sa2
        where sa2.pid = ANY(pg_blocking_pids(sa.pid)))
from pg_stat_activity sa
where cardinality(pg_blocking_pids(sa.pid)) > 0;

Вы будете знать, что это работает, если вы получите сообщение о том, что подзапрос возвращает более одной строки.В этом случае добавьте array_agg() к подзапросу.

...