Конвертация типа данных timestamp из Microsoft SQL Server в PostgreSQL
В Microsoft SQL Server timestamp является синонимом для типа данных rowversion. Rowversion представляет собой счетчик, который увеличивается при каждой операции вставки или обновления в таблице, где есть столбец типа rowversion. Этот счетчик отслеживает порядок изменений в базе данных, но не привязан к реальному времени.
В таблице может быть только один столбец rowversion. Каждый раз, когда строка с таким столбцом изменяется или вставляется, в столбец записывается новое увеличенное значение счетчика rowversion.
PostgreSQL не поддерживает тип данных timestamp, поэтому требуются существенные изменения в коде. Рассмотрим следующий фрагмент кода:
CREATE TABLE dbo.ExampleTable
(
PriKey INT NOT NULL,
timestamp TIMESTAMP NOT NULL
);
ALTER TABLE dbo.ExampleTable ADD CONSTRAINT PK__ExampleT__0DAA475129938053
PRIMARY KEY (PriKey);
В PostgreSQL аналогом типа данных timestamp может быть тип bytea. Чтобы имитировать увеличение значения при вставке или обновлении данных в таблице, нужно использовать триггер.
В результате мы получаем:
CREATE TABLE dbo.ExampleTable
(
PriKey INTEGER NOT NULL,
timestamp BYTEA NOT NULL
);
ALTER TABLE dbo.ExampleTable add CONSTRAINT PK__ExampleT__0DAA475129938053
PRIMARY KEY(PriKey);
create function swf_increment_timestamp_exampletable_timestamp()
returns trigger
as
$$
begin
IF exists(select 1 from exampletable) then
new.timestamp := int8send((select max ('x'||lpad(encode(timestamp, 'hex'), 16, '0'))::bit(64)::bigint from exampletable)+1::bigint);
return new;
else
new.timestamp := int8send(1);
return new;
end if;
end;
$$
language plpgsql;
create trigger swt_timestamp_trigger_exampletable_timestamp
before insert or update on ExampleTable
for each row
execute procedure swf_increment_timestamp_exampletable_timestamp();
Сравним результаты:
Как видите, это решение полностью повторяет логику типа данных timestamp.
Данное решение автоматически выполняется нашим программным обеспечением Конвертум Мастер. Каждый столбец типа данных timestamp будет преобразован в столбец типа данных bytea. Для каждого такого столбца будет создан триггер, который будет увеличивать значение столбца. Этот триггер будет запускаться при вставке или обновлении данных в каждой строке.
Если у вас есть другие вопросы, пожалуйста, свяжитесь с нами: support@convertum.ru