Создание полей родительской таблицы с использованием таблиц словаря данных в Postgres - PullRequest
0 голосов
/ 23 января 2019

Как мы можем захватить таблицу первичного ключа и ее поля, которые используются в качестве ссылки для соответствующих внешних ключей, используя таблицы словаря данных.,

Ниже приведен код

WITH PRIMARY_REF AS
(select string_agg(cu.column_name,',') COL1_NAME, tc.table_name tab_name
from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CU,
INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
where CU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME 
and   TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
and UPPER(TC.CONSTRAINT_SCHEMA) = 'SSP2_PCAT'
group by tab_name order by tc.table_name),
FOREIGN_REF AS
(select string_agg(U.column_name,',') COL2_NAME, TC.TABLE_NAME 
from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE U, 
 INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS FK,
 INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
where U.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
and   FK.CONSTRAINT_NAME = TC.CONSTRAINT_NAME 
--and   TC.TABLE_NAME = U.TABLE_NAME
and   TC.CONSTRAINT_TYPE = 'FOREIGN KEY'
and UPPER(TC.CONSTRAINT_SCHEMA) = 'SSP2_PCAT'
--and   UPPER(TC.TABLE_NAME) = 'ADDITIONAL_RULES'   
group by TC.TABLE_NAME) 
SELECT DISTINCT 'ALTER TABLE'||' SSP2_PCAT.'||cs.TABLE_NAME || 
' ADD CONSTRAINT ' ||rc.CONSTRAINT_NAME ||
' FOREIGN KEY ' ||COL2_NAME ||
' REFERENCES '||' SSP2_PCAT.'||TAB_NAME || ' (' || COL1_NAME || ') ' || ' 
ON UPDATE ' || rc.UPDATE_RULE || ' ON DELETE ' || rc.DELETE_RULE ||';'
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC, 
INFORMATION_SCHEMA.TABLE_CONSTRAINTS CS, 
PRIMARY_REF,
FOREIGN_REF
WHERE 
cs.TABLE_NAME = FOREIGN_REF.TABLE_NAME AND
FOREIGN_REF.TABLE_NAME = PRIMARY_REF.TAB_NAME AND 
RC.CONSTRAINT_NAME = CS.CONSTRAINT_NAME AND
UPPER(cs.CONSTRAINT_SCHEMA) = 'SSP2_PCAT'
AND UPPER(cs.TABLE_NAME) = 'ADDITIONAL_RULES';

Ожидаемый результат:

ALTER TABLE ssp2_pcat.additional_rules ADD CONSTRAINT fk1_addnl_rules FOREIGN KEY (offer_id, promotion_id) REFERENCES ssp2_pcat.promotion_offer (offer_id, promotion_id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION;

Результат запроса выше:

ALTER TABLE SSP2_PCAT.additional_rules ADD CONSTRAINT fk1_addnl_rules FOREIGN KEY (promotion_id,offer_id) REFERENCES SSP2_PCAT.**additional_rules** **(offer_id,promotion_id,channel,rule_grp_cd,rule_subgp_cd,rule_type, rule_start_date,rule_value,addnl_ruleid,promotion_id,offer_id)** ON UPDATE NO ACTION ON DELETE NO ACTION;

Таким образом, не возвращается правильная родительская таблица и поля, которые используются как ссылка на внешние ключи, похоже, мне не хватает некоторой таблицы словаря данных или условия фильтра, на данный момент я просто тестирую свой скрипт один раз только с одной таблицей, в случае успеха я могу использовать предложение in с окном 150 таблиц в одном скрипте.

Любая помощь абсолютно признательна! Спасибо за ваше время

...