获取表和列"拥有"序列

dan*_*car 12 postgresql database-design

我可以运行以下行:

ALTER SEQUENCE seqName OWNED BY table.id;
Run Code Online (Sandbox Code Playgroud)

如何OWNED BY为序列设置"所有者" (在这种情况下:) table.id

ale*_*ius 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'
Run Code Online (Sandbox Code Playgroud)

它返回包含所有者信息的所有序列.只需在WHERE子句中过滤它们即可.


Erw*_*ter 11

获取"拥有"表和列

ALTER SEQUENCE seqName OWNED BY table.id;
Run Code Online (Sandbox Code Playgroud)

您的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;
Run Code Online (Sandbox Code Playgroud)
  • 双引号("")仅用于其他非法名称(大小写混合,保留字,......).

  • 不需要声明refclassid类型,regclass因为连接pg_attribute自动执行此操作.
    无需断言序列是序列,因为名称是唯一的.
    无需加入pg_classpg_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
Run Code Online (Sandbox Code Playgroud)