Oracle SQL / PL SQL: мне нужно скопировать данные из одной базы данных в другую - PullRequest
0 голосов
/ 10 января 2020

У меня есть два экземпляра одной и той же базы данных, но данные передаются только в «исходную». Мне нужно скопировать вставленные данные из определенных таблиц и автоматически зафиксировать их в тех же таблицах во второй БД. Как я могу это сделать?

Я уже создал синонимы для таблиц во второй БД в оригинале и в специально подготовленном триггере. Я пытался использовать оператор INSERT INTO ... с :new., но это вызывает данные не будут нигде зафиксированы, и я получаю Oracle ошибки типа:

ORA-02291: ограничение целостности (PRDBSHADOW.FK_ED_PHY_ENT) нарушено.

Вот мой триггер код

create or replace TRIGGER INS_COPY_DATA
AFTER INSERT ON ORIGDB.TABLE_A
REFERENCING NEW AS NEW OLD AS OLD

FOR EACH ROW
BEGIN

  insert into COPY_TABLE_A(val1,val2,val3,val4) values (:new.val1, :new.val2, :new.val3, :new.val4);

END;

1 Ответ

1 голос
/ 10 января 2020

Я думаю, что запись в родительской таблице здесь отсутствует. По крайней мере, конец ограничения FK говорит мне об этом.

Это означает, что вам нужно сначала вставить все данные в «родительскую» таблицу, чтобы иметь возможность вставлять записи в «дочерний».

Например, таблица auto_maker имеет только 3 строки: Audi, Peugeot и Honda. Другая таблица с именем «модель» имеет 2 столбца «производитель» и «модель». «maker» - это внешний ключ, ссылающийся на таблицу «auto_maker».

Это означает, что в таблице моделей разрешены только записи, значение столбца которых «maker» существует в таблице «auto_maker».

Другими словами, доступны только они:

модель производителя Audi A4 Peugeot 308 Honda Accord

Конечно, вы можете ввести каждую модель, которую вы будете sh, но значение "производитель" должно существовать в таблице auto_maker.

Это, вероятно, и происходит: триггер пытается вставить данные в столбец, который ссылается на "родительскую" таблицу, а значение: new просто не существует.

Следующий скрипт даст вам знать, какую таблицу нужно заполнить первой.

select aic.index_owner, aic.table_name, aic.column_name
  from all_constraints uc,
       all_ind_columns aic
 where aic.INDEX_NAME = uc.r_constraint_name
   and uc.table_name = 'TABLE_A'
   and uc.constraint_type = 'R';

Если запрос возвращает что-то, просто создайте похожие триггеры для этих таблиц с похожими логиками c, у вас уже есть

...