Синхронизация таблиц в Oracle - PullRequest
6 голосов
/ 08 июня 2009

Мы собираемся провести параллельное тестирование, чтобы сравнить устаревшую систему с новой блестящей версией. У нас есть таблица базы данных Oracle A, в которой хранятся данные для унаследованной системы, и эквивалентная таблица B, в которой хранятся данные для новой системы, поэтому на время теста база данных денормализована. (Кроме того, прежняя система и таблица A исправлены - изменения не допускаются)

Что я хочу сделать, это разрешить редким операциям DML на A распространяться на B и наоборот. Я начал с пары триггеров, чтобы сделать это, но столкнулся с очевидной проблемой: когда триггеры запускаются, таблицы изменяются и выдается исключение.

Есть ли стандартный способ решения этой проблемы? Я читал разные отчеты о том, стоит ли использовать dbms_scheduler ...

Спасибо

Andy

Обновление: Я закончил разгадывать всю проблему и гарантировал, что все хранимые процедуры, которые обновляют A, также обновляют B, и наоборот.

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

Я пометил ответ JosephStyon, потому что я кратко заставил все работать, добавив два триггера уровня оператора вставки / обновления в таблицы A и B, а затем выполнил процедуру слияния, используя A или B в качестве главной таблицы, в зависимости от того, какой триггер побежал (хотя сначала я проверил, что целевая таблица будет изменена слиянием, в противном случае - раньше).

Ответы [ 4 ]

3 голосов
/ 08 июня 2009

Я бы создал 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 триггерах для обоих представлений вы должны поместить данные в обе базовые таблицы.

1 голос
/ 08 июня 2009

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

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

1 голос
/ 08 июня 2009

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

--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 голос
/ 08 июня 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...