Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Oracle |
![]() ![]() |
IGOLNI Member Откуда: г.Ливны Орловской обл. Сообщений: 71 |
Здравствуйте. Не подскажите, как правильно реализовать задачу. Есть два различных сервера Oracle 9. В табличном пространстве каждого есть несколько таблиц полностью идентичных по структуре и содержанию. Необходимо их синхронизировать, чтобы обновления в одной - отражались в этой же таблице на другом сервере (допустимо в одностороннем направлении). |
5 дек 05, 16:23 [2142152] Ответить | Цитировать Сообщить модератору |
Terrorist Member Откуда: Киев Сообщений: 45 |
Вариантов несколько: 1. Триггером. Недостатки - необходимо как-то обрабатывать изменения в мастер таблице(та на которой триггер висит) во время недоступности подчиненной таблицы. 2. Сделать джоб на удаленной базе который будет делать примерно следующее
3. Смотреть доку доку на предмет SNAPSHOTS так же они называются Materialized Views |
|
5 дек 05, 16:52 [2142308] Ответить | Цитировать Сообщить модератору |
news Member Откуда: Тверь Сообщений: 129 |
Организовать репликацию между БД, если одна для отчетов, а другая боевая то еще настроить триггеры на insert, delete |
5 дек 05, 16:53 [2142314] Ответить | Цитировать Сообщить модератору |
Между сообщениями интервал более 1 года. |
topov Member Откуда: Одесса Сообщений: 12 |
Если через JOB то можно так:create or replace TYPE "ARRAYOFSTRINGS" AS TABLE OF VARCHAR2(4000); create or replace PROCEDURE P_RECONS_ZOMBI (ARG_TABLE VARCHAR2, ARG_ZOMBI VARCHAR2, ARG_UNIC_COLUMN_NAME VARCHAR2 DEFAULT NULL) AS v_sql varchar2(4000); v_columns_list varchar2(4000); v_columns_concat varchar2(4000); v_table varchar2(30); v_zombi varchar2(30); v_unic_column_name varchar2(30); v_unic_column_type varchar2(100); TYPE t_array_rowid IS TABLE OF ROWID INDEX BY PLS_INTEGER; v_array_rowid t_array_rowid; v_arrayofstrings ARRAYOFSTRINGS; BEGIN v_table := upper(trim(arg_table)); v_zombi := upper(trim(arg_zombi)); v_unic_column_name := upper(trim(arg_unic_column_name)); select LISTAGG(COLUMN_NAME, ', ') WITHIN GROUP (order by COLUMN_ID) as columns_list, LISTAGG(COLUMN_NAME, ' || ') WITHIN GROUP (order by COLUMN_ID) as columns_concal into v_columns_list, v_columns_concat from user_tab_columns where table_name = v_zombi; -- delete rows from zombi table if v_unic_column_name is not null then select decode(DATA_TYPE,'NUMBER','to_number(t.column_value)','t.column_value') into v_unic_column_type from user_tab_columns where table_name = v_zombi and COLUMN_NAME = v_unic_column_name; EXECUTE IMMEDIATE ' select to_char(' || v_unic_column_name || ') from ( select ' || v_columns_list || ' from ' || v_zombi || ' minus select ' || v_columns_list || ' from ' || v_table || ' )' BULK COLLECT INTO v_arrayofstrings; v_sql := 'declare v_arrayofstrings ARRAYOFSTRINGS; begin select /*+ cardinality(t 1) */ rowidtochar(z.rowid) bulk collect into v_arrayofstrings from ' || v_zombi || ' z, table(cast(:1 as arrayofstrings)) t where ' || v_unic_column_type || ' = z.' || v_unic_column_name || '; :1 := v_arrayofstrings; end;'; EXECUTE IMMEDIATE v_sql USING IN OUT v_arrayofstrings; FORALL i IN v_arrayofstrings.FIRST..v_arrayofstrings.LAST EXECUTE IMMEDIATE 'DELETE FROM ' || v_zombi || ' WHERE rowid = chartorowid(:1)' USING v_arrayofstrings(i); else EXECUTE IMMEDIATE 'select z.row_id from (select rowid as row_id, sys.dbms_obfuscation_toolkit.MD5(input_string => ' || v_columns_concat || ') as zombi_hash from ' || v_zombi || ') z left join (select sys.dbms_obfuscation_toolkit.MD5(input_string => ' || v_columns_concat || ') as zombi_hash from ' || v_table || ') t on z.zombi_hash = t.zombi_hash where t.zombi_hash is null' BULK COLLECT INTO v_array_rowid; FORALL i IN v_array_rowid.FIRST..v_array_rowid.LAST EXECUTE IMMEDIATE 'DELETE FROM ' || v_zombi || ' WHERE rowid = :1' USING v_array_rowid(i); end if; -- insert rows to zombi table EXECUTE IMMEDIATE ' insert into ' || v_zombi || ' (' || v_columns_list || ') select ' || v_columns_list || ' from ( select ' || v_columns_list || ' from ' || v_table || ' minus select ' || v_columns_list || ' from ' || v_zombi || ' )'; commit; END P_RECONS_ZOMBI; запуск: -- example 1 exec P_RECONS_ZOMBI('from_table','to_table','column_with_pk'); -- example 2 exec P_RECONS_ZOMBI('from_table','to_table'); Первый пример работает быстрее т.к. использует уникальное поле. Второй основывается на hash (md5 - 128) |
13 сен 18, 19:23 [21674134] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1221 |
topov, 13 лет спустя, несомненно, автор топика будет рад получить от Вас ценный совет... ![]() |
13 сен 18, 19:41 [21674145] Ответить | Цитировать Сообщить модератору |
mibin Member Откуда: Сообщений: 32 |
Щукина Анна, |
13 сен 18, 21:51 [21674217] Ответить | Цитировать Сообщить модератору |
mibin Member Откуда: Сообщений: 32 |
Зато другим может помочь. |
||
13 сен 18, 21:51 [21674219] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1221 |
Вы первый день на форуме? Поверьте, никто тут из новичков не пользует поиск, не читает F.A.Q. и темы в ТОПах, не говоря уже о просмотре хотя бы первых 2-3-х страниц тем на форуме. Каждый сразу задает вопрос, находясь в полнейшей уверенности, что он уникален и только у него возникла такая проблема... Им невдомек, что эти вопросы уже по 100500 раз перетерты на просторах форума... Это я вам говорю, как "читатель" форума с 2004 года (а с 2006 - зарегистрированный участник и, иногда, "писатель"). |
||
14 сен 18, 04:55 [21674308] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ Сообщений: 28677 |
|
||||
14 сен 18, 07:31 [21674320] Ответить | Цитировать Сообщить модератору |
Вячеслав Любомудров Member Откуда: Владивосток Сообщений: 17962 |
Оно никаким не удовлетворяет при использовании LOB и/или пользовательских типов |
14 сен 18, 07:40 [21674322] Ответить | Цитировать Сообщить модератору |
-2- Member Откуда: Сообщений: 14347 |
topov, Одноколоночный ключ или коллизии и ограничение по ширине строки с потерей точности. Не все типы. Поломается при изменении таблицы в другой транзакции. Ограничение по количеству строк. Ограничение по идентификаторам. dbms_obfuscation_toolkit депрекейтед. |
14 сен 18, 10:33 [21674438] Ответить | Цитировать Сообщить модератору |
Все форумы / Oracle | ![]() |