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
здесь, скорее, это дает то же имя таблицы после ALTER TABLE
Ключевые слова.
Я надеюсь, что это понятно, так как мы используем Dynamic SQL здесь, и любая помощь абсолютно признательна!
1 ответ
В вашем запросе отсутствует пара таблиц соединения и условия соединения. Также не забывайте, что внешний ключ может быть определен более чем в одном столбце. Наконец, ваш запрос уязвим для внедрения SQL через имена объектов.
Но было бы намного проще, если бы вы использовали pg_catalog.pg_constraint
а не `информационная_схема":
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';