获取表和列“拥有”序列

时间:2011-08-04 11:59:57

标签: postgresql database-design

我可以运行以下行:

ALTER SEQUENCE seqName OWNED BY table.id;

如何通过OWNED BY为序列设置“所有者”(在这种情况下为table.id)?

4 个答案:

答案 0 :(得分:16)

您可以使用以下查询:

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子句中过滤它们即可。

答案 1 :(得分:10)

获取“拥有”表和列

ALTER SEQUENCE seqName OWNED BY table.id;

您的ALTER SEQUENCE语句导致系统目录pg_depend中的条目具有依赖关系类型(deptype'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_classpg_namespace

  • 架构名称只需要消除歧义,或者它不在search_path中。

    可以在多个模式中使用相同的表名(或该事项的序列名)。如果您省略了架构限定,则转换为object identifier type 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 :(得分:2)

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'
    ); 

答案 3 :(得分:0)

我能够使用以下 SQL 语句列出特定列的表和相应序列:

SELECT   table_schema
       , table_name 
       , column_name
       , LTRIM(RTRIM(RTRIM(column_default, '::regclass)'),''''),'nextval(''') AS SEQUENCE_NAME
FROM information_schema.columns
WHERE  column_default like '%nextval%';