Неожиданное поведение при использовании столбца преобразования и таблицы преобразования, SymmetricDS - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть следующие столбцы преобразования

insert into SYM_TRANSFORM_COLUMN (
        transform_id, include_on, target_column_name, source_column_name, pk,
        transform_type, transform_expression, transform_order, last_update_time,
        create_time
) values (
        'send_source_node_id', '*', 'node_id', 'employee_id', 1,
        'bsh', 'String node = targetNode.getNodeId(); String value = currentValue; return value + "-" + sourceNodeId;', 1, current_timestamp, current_timestamp
);


insert into SYM_TRANSFORM_COLUMN (
        transform_id, include_on, target_column_name, source_column_name, pk,
        transform_type, transform_expression, transform_order, last_update_time,
        create_time
) values (
        'copy_employee_id', '*', 'employee_id', 'employee_id', 0,
        'copy', '', 10, current_timestamp, current_timestamp
);

insert into SYM_TRANSFORM_COLUMN (
        transform_id, include_on, target_column_name, source_column_name, pk,
        transform_type, transform_expression, transform_order, last_update_time,
        create_time
) values (
        'copy_employee_name', '*', 'name', 'name', 0,
        'copy', '', 10, current_timestamp, current_timestamp
);

С его таблицами преобразования

insert into SYM_TRANSFORM_TABLE (
        transform_id, source_node_group_id, target_node_group_id, transform_point, source_table_name,
        target_table_name, update_action, delete_action, transform_order, column_policy, update_first,
        last_update_time, create_time
) values (
        'copy_employee_id', 'school', 'main-school', 'EXTRACT', 'employees',
        'employees', 'UPDATE_COL', 'DEL_ROW', 1, 'IMPLIED', 0,
         current_timestamp, current_timestamp
);

insert into SYM_TRANSFORM_TABLE (
        transform_id, source_node_group_id, target_node_group_id, transform_point, source_table_name,
        target_table_name, update_action, delete_action, transform_order, column_policy, update_first,
        last_update_time, create_time
) values (
        'copy_employee_name', 'school', 'main-school', 'EXTRACT', 'employees',
        'employees', 'UPDATE_COL', 'DEL_ROW', 1, 'IMPLIED', 0,
         current_timestamp, current_timestamp
);

insert into SYM_TRANSFORM_TABLE (
        transform_id, source_node_group_id, target_node_group_id, transform_point, source_table_name,
        target_table_name, update_action, delete_action, transform_order, column_policy, update_first,
        last_update_time, create_time
) values (
        'send_source_node_id', 'school', 'main-school', 'EXTRACT', 'employees',
        'employees', 'UPDATE_COL', 'DEL_ROW', 1, 'IMPLIED', 0,
         current_timestamp, current_timestamp
);

Структура моей исходной таблицы

create table  employees (
    employee_id serial,
    name varchar(50),
    CONSTRAINT departments_pk PRIMARY KEY (employee_id)
);

Структура моей целевой таблицы

create table  employees (
    master_employee_id uuid default uuid_generate_v1(),
    employee_id integer,
    name varchar(50),
    node_id varchar(50),
    CONSTRAINT employees_pk PRIMARY KEY (master_employee_id)
);

Синхронизация работает отлично с другими идентичными таблицами, но эти таблицы не работают нормально, потому что при добавлении нового сотрудника в исходную таблицу две записи будут добавлены в целевую таблицу. Я не знаю об этом поведении, может кто-нибудь объяснить мне?

Пример результата в целевой таблице

1 Ответ

0 голосов
/ 19 февраля 2020

Каждая запись в sym_transform_table представляет отображение таблицы, которое будет обрабатывать изменения строки для исходной таблицы. Поскольку у вас есть 3 отображения таблицы для одной и той же исходной таблицы, каждое изменение строки в этой таблице приведет к 3 преобразованным строкам.

Я думаю, что вы хотели использовать 1 отображение таблицы в sym_transform_table, например:

insert into SYM_TRANSFORM_TABLE (
    transform_id, source_node_group_id, target_node_group_id, transform_point, source_table_name,
    target_table_name, update_action, delete_action, transform_order, column_policy, update_first,
    last_update_time, create_time
) values (
    'employees_to_employees', 'school', 'main-school', 'EXTRACT', 'employees',
    'employees', 'UPDATE_COL', 'DEL_ROW', 1, 'IMPLIED', 0,
     current_timestamp, current_timestamp
);

Затем измените ваши записи в sym_transform_column, чтобы они ссылались на него, используя тот же идентификатор преобразования "employee_to_employees".

...