Получить таблицу и столбец "владеющий" последовательностью - PullRequest
12 голосов
/ 04 августа 2011

Я могу запустить следующую строку:

ALTER SEQUENCE seqName OWNED BY table.id;

Как я могу получить 'владельца', установленный на OWNED BY для последовательности (в данном случае: table.id)?

Ответы [ 3 ]

16 голосов
/ 04 августа 2011

Вы можете использовать следующий запрос:

select s.relname as seq, n.nspname as sch, t.relname as tab, a.attname as col
from pg_class s
  join pg_depend d on d.objid=s.oid and d.classid='pg_class'::regclass and d.refclassid='pg_class'::regclass
  join pg_class t on t.oid=d.refobjid
  join pg_namespace n on n.oid=t.relnamespace
  join pg_attribute a on a.attrelid=t.oid and a.attnum=d.refobjsubid
where s.relkind='S' and d.deptype='a'

Возвращает все последовательности с информацией о владельце.Просто отфильтруйте их в предложении WHERE и все.

10 голосов
/ 15 июля 2013

Получить "владеющую" таблицу и столбец

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
2 голосов
/ 14 июля 2013
SELECT c.relname,u.usename 
  FROM pg_class c, pg_user u
 WHERE c.relowner = u.usesysid and c.relkind = 'S'
   AND relnamespace IN (
    SELECT oid
      FROM pg_namespace
     WHERE nspname NOT LIKE 'pg_%'
       AND nspname != 'information_schema'
    ); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...