Попробовать бесплатно

Конвертация типа данных 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();

Сравним результаты: result_of_compare Как видите, это решение полностью повторяет логику типа данных timestamp.

Данное решение автоматически выполняется нашим программным обеспечением Конвертум Мастер. Каждый столбец типа данных timestamp будет преобразован в столбец типа данных bytea. Для каждого такого столбца будет создан триггер, который будет увеличивать значение столбца. Этот триггер будет запускаться при вставке или обновлении данных в каждой строке.


Если у вас есть другие вопросы, пожалуйста, свяжитесь с нами: support@convertum.ru