Postgres 使用数据字典表生成 sql 输出
Postgres generate sql output using data dictionary tables
我只需要将 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
,
而是在 ALTER TABLE
关键字之后给出相同的 table_name。
我希望这是清楚的,因为我们在这里使用动态 SQL,非常感谢任何帮助!
您的查询缺少几个连接表和连接条件。另外,不要忘记可以在多个列上定义一个外键。最后,您的查询容易受到 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';
我只需要将 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
,
而是在 ALTER TABLE
关键字之后给出相同的 table_name。
我希望这是清楚的,因为我们在这里使用动态 SQL,非常感谢任何帮助!
您的查询缺少几个连接表和连接条件。另外,不要忘记可以在多个列上定义一个外键。最后,您的查询容易受到 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';