首页 > 解决方案 > Postgres 使用数据字典表生成 sql 输出

问题描述

我所需要的只是得到一个 SQL 查询输出:

ALTER TABLE TABLE_NAME
ADD CONSTRAINT
FOREIGN KEY (COLUMN_NAME)
   REFERENCES (PARENT_TABLE_NAME);

我正在使用数据字典表运行以下动态查询,

SELECT DISTINCT
   'ALTER TABLE  ' || cs.TABLE_NAME ||
   'ADD CONSTRAINT' || rc.CONSTRAINT_NAME ||
   'FOREIGN KEY' || c.COLUMN_NAME ||
   'REFERENCES' || cs.TABLE_NAME ||
   ' (' || cs.CONSTRAINT_NAME || ') ' ||
   ' ON UPDATE ' || rc.UPDATE_RULE ||
   ' ON DELETE ' || rc.DELETE_RULE
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC,
   INFORMATION_SCHEMA.TABLE_CONSTRAINTS CS, 
   INFORMATION_SCHEMA.COLUMNS C
WHERE cs.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
  AND cs.TABLE_NAME = c.TABLE_NAME 
  AND UPPER(cs.TABLE_SCHEMA) = 'SSP2_PCAT';

但是在这里,即使我能够生成所需的输出,但问题在于它没有给出这里,而是在关键字PARENT_TABLE_NAME之后给出相同的 table_name 。ALTER TABLE

我希望这很清楚,因为我们在这里使用动态 SQL,并且非常感谢任何帮助!

标签: postgresqldynamic-sqlpostgresql-9.3database-metadata

解决方案


您的查询缺少几个连接表和连接条件。另外,不要忘记可以在多个列上定义外键。最后,您的查询容易受到通过对象名称的 SQL 注入的攻击。

pg_catalog.pg_constraint但是如果你使用而不是`information_schema' ,它会简单得多:

SELECT format('ALTER TABLE %s ADD CONSTRAINT %I %s',
              conrelid::regclass,
              conname,
              pg_get_constraintdef(oid))
FROM pg_catalog.pg_constraint
WHERE contype = 'f'
  AND upper(connamespace::regnamespace::text) = 'SSP2_PCAT';

推荐阅读