Получить "владеющую" таблицу и столбец
ALTER SEQUENCE seqName OWNED BY table.id;
Ваш оператор ALTER SEQUENCE
вызывает запись в системном каталоге pg_depend
с типом зависимости (deptype
) 'a' и a refobjsubid
больше 0 , указывая на номер атрибута (attnum
) в pg_attribute
.Обладая этими знаниями, вы можете разработать простой запрос:
SELECT d.refobjid::regclass, a.attname
FROM pg_depend d
JOIN pg_attribute a ON a.attrelid = d.refobjid
AND a.attnum = d.refobjsubid
WHERE d.objid = 'public."seqName"'::regclass -- your sequence here
AND d.refobjsubid > 0
AND d.classid = 'pg_class'::regclass;
Двойные кавычки (""
) нужны только для недопустимых имен (смешанный регистр, зарезервированные слова, ...).
Нет необходимости утверждать, что refclassid
имеет тип regclass
, поскольку соединение с pg_attribute
делает это автоматически.
Нет необходимости утверждать, что последовательность являетсяпоследовательность, поскольку имя уникально.
Нет необходимости присоединяться к pg_class
или pg_namespace
.
Имя схемы необходимо только для устранения неоднозначности или если оно не вsearch_path
.
Одно и то же имя таблицы (или имя последовательности в этом отношении) может использоваться в нескольких схемах.Приведение к идентификатору объекта типа regclass
наблюдает за текущим search_path
, чтобы выбрать наилучшее совпадение, если вы пропустите квалификацию схемы.Если таблица не видна, вы получите сообщение об ошибке.
Более того, тип regclass
автоматически отображается как text
для пользователя.(Если нет, приведите к text
.) Имя схемы добавляется автоматически, если это не первое совпадение в search_path
, что гарантирует однозначный вывод для вашего сеанса.
Получить фактического «владельца» (роль)
Чтобы получить роль, владеющую определенной последовательностью, в соответствии с запросом:
SELECT c.relname, u.usename
FROM pg_class c
JOIN pg_user u ON u.usesysid = c.relowner
WHERE c.oid = '"seqName"'::regclass; -- your sequence here