Postgres генерирует вывод SQL, используя таблицы словаря данных - PullRequest
0 голосов
/ 22 января 2019

Все, что мне нужно, это получить вывод 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 Ответ

0 голосов
/ 24 января 2019

В вашем запросе отсутствует пара таблиц соединения и условия соединения. Также не забывайте, что внешний ключ может быть определен более чем в одном столбце. Наконец, ваш запрос уязвим для внедрения 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';
...