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_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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8649 次 |
| 最近记录: |