我可以运行以下行:
ALTER SEQUENCE seqName OWNED BY table.id;
如何通过OWNED BY
为序列设置“所有者”(在这种情况下为table.id
)?
答案 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_class
或pg_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%';