Старый вопрос, но ни один из ответов правильно не соответствует null
значениям.
Использование <> или! = Поставит вас в затруднительное положение при сравнении значений для различий, если в новом или старом значении есть потенциальный ноль для безопасного обновления только при изменении, используйте оператор is distinct from
в Postgres. Подробнее об этом здесь
Я бы создал 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
триггеры для обоих представлений , вы должны поместить данные в обе базовые таблицы.
Вы действительно имеете в виду DDL, а не DML?
В DML вы можете взглянуть на Oracles Multi Master Replication , чтобы синхронизировать таблицы, или вы также можете взглянуть на инструмент SymmetricDS для этой цели.
] Единственное известное мне решение с DDL - это снова Расширенная репликация Oracle .
Поместите следующие три оператора в хранимую процедуру, а затем запускайте ее как запланированное задание так часто, как вам нравится:
--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
);
Oracle 10g и выше реализовали Уведомление об изменениях как асинхронный процесс. Это автоматически, и этот пакет включен в серверную установку Oracle 10g и выше.
Вы можете увидеть здесь для получения некоторой информации.