Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / голденгейт изменение в столбце условия выгрузки / 7 сообщений из 7, страница 1 из 1
06.01.2022, 13:17
    #40124951
AlexVin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
голденгейт изменение в столбце условия выгрузки
гг 19

таблица id,stolb1,stolb2
id - primary key, stolb2 - не ключевой столбец
экстракт where stolb2 <> 1

если строка сначала попадала, а потом после апдейта перестала попадать в условие, то изменение не улетит, и на целевой базе останется такая строка со старым значением столбца, никуда она не удалится
если строка сначала не попадала, а потом после апдейта стала попадать в условие, то на целевой базе строки нет и гг получит No data found

как решить правильно такие ситуации?
убрать условие не предлагать)
есть ли, например, параметр вставить строку, если прилетел апдейт, а её нет?
...
Рейтинг: 0 / 0
06.01.2022, 16:21
    #40124984
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
голденгейт изменение в столбце условия выгрузки
Отработать логику на apply, а не на экстракт.
...
Рейтинг: 0 / 0
06.01.2022, 17:32
    #40124990
SeaGate
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
голденгейт изменение в столбце условия выгрузки
AlexVinесли строка сначала попадала, а потом после апдейта перестала попадать в условие, то изменение не улетит, и на целевой базе останется такая строка со старым значением столбца, никуда она не удалится
Придеться условия на extract менять. Например (без учета null):
Код: plsql
1.
TABLE xyz, FILTER(ON UPDATE, @BEFORE(stolb2) <> 1 AND @AFTER(stolb2) = 1);


Соответственно, с ALLOWDUPTARGETMAP .
На replicat через GETUPDATES / SQLEXEC можно будет провести удаление.
AlexVinесли строка сначала не попадала, а потом после апдейта стала попадать в условие, то на целевой базе строки нет и гг получит No data found
Проще всего через INSERTMISSINGUPDATES + необходимый supplemental logging для всех / нужных полей.

В целом, если будут какие-то многоэтажные конструкции получаться, то я бы в макросы завернул, чтобы вся логика была на уровне макроса, а на уровне файлов параметров только вызов макросов и других файлов или несложные маппинги.
Вот, например, примерно такой макрос для исторических таблиц использую:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
MACRO #history_table_colmap
BEGIN
  COLMAP(USEDEFAULTS,
         ggs_sequence_id = @COMPUTE(@COMPUTE(@NUMSTR(@GETENV ('RECORD', 'FILESEQNO'))*100000000000)+@NUMSTR(@GETENV ('RECORD', 'FILERBA'))),
         ggs_trans_timestamp = @GETENV('GGHEADER','COMMITTIMESTAMP'),
         ggs_before_after_ind = @GETENV('GGHEADER','BEFOREAFTERINDICATOR'),
         ggs_log_pos = @GETENV('GGHEADER','LOGPOSITION'),
         ggs_log_rba = @GETENV('GGHEADER','LOGRBA'),
         ggs_op_type = @GETENV('GGHEADER','OPTYPE'))
END;

MACRO #history_table_cdb
PARAMS ( #container, #owner, #history_owner, #table_name)
BEGIN
MAP #container.#owner.#table_name, TARGET #history_owner.#table_name, #history_table_colmap ();
END;

MACRO #history_table_non_cdb
PARAMS ( #owner, #history_owner, #table_name)
BEGIN
MAP #owner.#table_name, TARGET #history_owner.#table_name, #history_table_colmap ();
END;


В файле параметров простой вызов макроса:
Код: plsql
1.
#history_table_non_cdb (owner, history_owner, table_name)
...
Рейтинг: 0 / 0
06.01.2022, 23:17
    #40125050
AlexVin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
голденгейт изменение в столбце условия выгрузки
SeaGate
Придется условия на extract менять. Например (без учета null):
Код: plsql
1.
TABLE xyz, FILTER(ON UPDATE, @BEFORE(stolb2) <> 1 AND @AFTER(stolb2) = 1);


Соответственно, с ALLOWDUPTARGETMAP .
На replicat через GETUPDATES / SQLEXEC можно будет провести удаление.

это в отдельный трейл писать?
...
Рейтинг: 0 / 0
07.01.2022, 02:10
    #40125065
SeaGate
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
голденгейт изменение в столбце условия выгрузки
AlexVinэто в отдельный трейл писать?
Если происходят обновления stolb2 -> 1 -> не 1, то в отдельном не безопасно, т.к. разные репликаты не смогут синхронизироваться.
Также нужно учитывать, что ALLOWDUPTARGETMAP не для integrated/parallel replicats.
В первом приближении, что-нибудь такое можно взять:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
-- extract
TABLE pdb.tc.t, FILTER (stolb2 <> 1 OR (@BEFORE(stolb2)<>1 AND stolb2 = 1));

-- replicat
ALLOWDUPTARGETMAP

INSERTMISSINGUPDATES
GETINSERTS
GETUPDATES
GETDELETES
MAP pdb.tc.t, &
  TARGET pdb.tc_repl.t, &
  FILTER(stolb2 <> 1);

IGNOREINSERTS
GETUPDATES
IGNOREDELETES
MAP pdb.tc.t, &
  TARGET pdb.tc_repl.t, &
  FILTER(stolb2 = 1), &
  SQLEXEC(ID del, QUERY 'DELETE tc_repl.t WHERE id = :id', PARAMS(id = id)),
  EVENTACTIONS(IGNORE);


Изначально была идея с двумя строками TABLE на extract и с ALLOWDUPTARGETMAP, но что-то с этим нормально не получилось с OGG 19.1.0.0.211019 Oracle 19c.
...
Рейтинг: 0 / 0
10.01.2022, 14:56
    #40125520
AlexVin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
голденгейт изменение в столбце условия выгрузки
SeaGate

Код: plsql
1.
2.
-- extract
TABLE pdb.tc.t, FILTER (stolb2 <> 1 OR (@BEFORE(stolb2)<>1 AND stolb2 = 1));




а для символьного столбца можно filter как-то попроще написать, чем вот так?)
Код: plsql
1.
TABLE pdb.tc.t, FILTER (@CASE(name, 'x', 0, 1) OR (@CASE(@BEFORE(name), 'x', 0, 1) AND @CASE(name, 'x', 1, 0)));



гг 19.1.0.0.210720
...
Рейтинг: 0 / 0
11.01.2022, 01:01
    #40125641
SeaGate
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
голденгейт изменение в столбце условия выгрузки
AlexVin

а для символьного столбца можно filter как-то попроще написать, чем вот так?)
Код: plsql
1.
TABLE pdb.tc.t, FILTER (@CASE(name, 'x', 0, 1) OR (@CASE(@BEFORE(name), 'x', 0, 1) AND @CASE(name, 'x', 1, 0)));



гг 19.1.0.0.210720

Через STREQ , как вариант:
Код: plsql
1.
TABLE pdb.tc.t, FILTER (@STREQ(name, 'x')=0 OR (@STREQ(@BEFORE(name), 'x')=0 AND @STREQ(name, 'x')));
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / голденгейт изменение в столбце условия выгрузки / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]