|
|
|
GoldenGate WHERE
|
|||
|---|---|---|---|
|
#18+
Доброго дня! Появилась необходимость выполнить фильтрацию данных процессов репликации. Вопрос осложняется условием фильтрования данных, т.к стандартными операторами сравнения, которыми оперирует WHERE увы не обойтись, а условие отбора представляет собой вложенный запрос, как на пример по Foreing Key. Подробное описание проблемы... При использовании стандартной конструкции все работает хорошо: EXTRACT EXT1 TABLE TEST, WHERE (COL1 = 50) Но условие представляет собой вложенный SELECT, пример следующий: EXTRACT EXT2 TABLE TEST1, WHERE (COL1 IN (SELECT TEST2.COL1 FROM TEST2 WHERE TEST2.COL1 = COL1)) Т.е. необходимо проверить (по ключу или нет, не важно) наличие данных в другой таблице, если таковы имеются реплицируем транзакции, в ином случае игнорируем. Конструкция WHERE, на сколько я утвердился, не подразумевает использование таких операторов как "IN" или "EXISTS" и вызов функций и повторное использование скобок " ( ) ". Использование SQLPREDICATE исключается, так как используется только при Initial load, и не работает при динамической фильтрации. Пробовал прописать #MACRO, тоже не помогло, так как все описанное в макросе, GG вуалирует в простой WHERE: TABLE TEST, #mymacro(<parametr>) <-- будет идентичен --> TABLE TEST, WHERE("то что в BODY #mymacro") Вызвать из схемы какую либо функцию которая возвратит значение для фильтрации тоже отказывается: EXTRACT EXT2 TABLE TEST1, WHERE (COL1 = MyFunction()) ругается что не понимает *MyFunction(). На Target стороне для репликатора, при использовании SQLEXEC так же не принесло результатов: MAP TEST1,TARGET TEST2, SQLEXEC (SPNAME <MyProcedure>, PARAMS (CODE_IN_PARAM = COL1)), COLMAP(USEDEFAULTS, COL1= @GETVAL(<MyProcedure>.CODE_OUT_PARAM)), EVENTACTIONS (IGNORE RECORD); В процедуре селект, который обращается в другую таблицу. Ппри это условии если процедура и ни чего не нашла, возвращается по логике NULL, но транзакции не уходят в ошибку и спокойно все инсертится и апдейтится. В целом не важно на какой стороне выполнять фильтр Source or Target. Прошу Вас поделится мыслями и идеями в способе реализации "усложненной" фильтрации репликации! Ну или я перед своим носом упустил самый элементарный способ :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 10:28 |
|
||
|
GoldenGate WHERE
|
|||
|---|---|---|---|
|
#18+
Используйте FILTER. Вот пример http://oracleabout.blogspot.ru/2014/06/goldengate-filter-data-using-lookup.html Только архитектурно так как вы делаете лучше не делать. Лучше реплицировать обе таблицы, а на приемнике вытаскивать нужные строки обычным SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 10:53 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=121&tid=1884265]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
23ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 334ms |

| 0 / 0 |
