Запретить вставку дубликатов в удаленной БД - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть таблица A1 на сервере S1 и таблица A2 на сервере S2.

Эти таблицы имеют одинаковую структуру, и я хочу применить оператор INSERT от A1 до A2 с помощью db_link.

Проблема в том, что я хочу предотвратить сбой всего оператора из-за уникальных ограничений или исключений уникальных индексов.

Я пытался использовать DML-ERROR-LOGGING, но он просто не может работать с db_link (исключение поднято для оператора).

Я также проверил вариант ignore_row_on_dupkey_index СОВЕТ, но та же проблема на удаленной БД.

Есть ли решение для этой проблемы?

Я использую версию Oracle 11g.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Наконец,

Я обнаружил, что применяется вставка, когда удаленная таблица является целью,

, а локальный источник не работает.

Но, выполнитькоманда, когда удаленная таблица является источником, а локальная является целью - работает нормально с ведением журнала ошибок.

(нам нужно поменять местами направления db_links и запустить команду с другого сервера).

пример:

--- use that:
-- connect to S2

-- run
insert into A2 select * from A1@S1.. log errors...;

--- instead of that:
-- connect to S1

-- run
insert into A2@S2 select * from A1.. log errors...;
0 голосов
/ 29 апреля 2019

Это также может быть медленнее, но так как вы не хотите, чтобы строка за строкой ...

INSERT INTO T1 (c1, c2, ...)
SELECT c1, c2, ...
FROM T2
WHERE NOT EXISTS 
    (SELECT *
     FROM T1 
     WHERE T1.c1 = T2.c1 AND . . . );

Кроме этого, другим методом будет: удаление ограничений, грязная вставка, удаление дубликатов, восстановление ограничений

...