Хранение таблиц, синхронизируемых в Oracle

Старый вопрос, но ни один из ответов правильно не соответствует null значениям.

Использование <> или! = Поставит вас в затруднительное положение при сравнении значений для различий, если в новом или старом значении есть потенциальный ноль для безопасного обновления только при изменении, используйте оператор is distinct from в Postgres. Подробнее об этом здесь

6
задан Andy 8 June 2009 в 17:34
поделиться

4 ответа

Я бы создал A и B как представления одной нормализованной (или денормализованной) таблицы и создал INSTEAD OF для обработки операций DML .

Если планы запроса имеют значение, лучше сохранить две копии таблиц: A_underlying и B_underlying и создайте представления следующим образом:

CREATE VIEW A
AS
SELECT  *
FROM    A_underlying

CREATE VIEW B
AS
SELECT  *
FROM    B_underlying

Предикаты будут помещены в представления, и планы запросов для фактических таблиц и представлений будут такими же.

В INSTEAD OF триггеры для обоих представлений , вы должны поместить данные в обе базовые таблицы.

3
ответ дан 17 December 2019 в 02:32
поделиться

Вы действительно имеете в виду DDL, а не DML?

В DML вы можете взглянуть на Oracles Multi Master Replication , чтобы синхронизировать таблицы, или вы также можете взглянуть на инструмент SymmetricDS для этой цели.

] Единственное известное мне решение с DDL - это снова Расширенная репликация Oracle .

1
ответ дан 17 December 2019 в 02:32
поделиться

Поместите следующие три оператора в хранимую процедуру, а затем запускайте ее как запланированное задание так часто, как вам нравится:

--Assume that "A" is a master, and "B" needs to be synched

--If no match in "A", delete from "B"
DELETE FROM B
WHERE NOT EXISTS(
                SELECT *
                FROM A
                WHERE A.PRIMARY_KEY = B.PRIMARY_KEY
                );

--If there is a match, but they are different, then update "B"
update 
  (
  select
    a.field1 as new_value1
   ,b.field1 as old_value1
   ,a.field2 as new_value2
   ,b.field2 as old_value2
   ,....
   ,a.fieldN as new_valueN
   ,b.fieldN as old_valueN
  from
    a
   ,b
 where a.primary_key = b.primary_key
 )
set
  old_value1 = new_value1
 ,old_value2 = new_value2
 ,....
 ,old_valueN = new_valueN;


--if the record is new to "A", then insert it into "B"
INSERT INTO B
SELECT *
FROM A 
WHERE NOT EXISTS(
                SELECT *
                FROM B 
                WHERE B.PRIMARY_KEY = A.PRIMARY_KEY
                );
1
ответ дан 17 December 2019 в 02:32
поделиться

Oracle 10g и выше реализовали Уведомление об изменениях как асинхронный процесс. Это автоматически, и этот пакет включен в серверную установку Oracle 10g и выше.

Вы можете увидеть здесь для получения некоторой информации.

1
ответ дан 17 December 2019 в 02:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: