Маппинг схем

Каждая база данных имеет свою структуру. Например, "пользователь" и "схема" используются в Oracle для обозначения одного и того же; СУБД PostgreSQL позволяют создавать собственные схемы в каждой базе данных; в MySQL термин "схема" является синонимом "база данных". В результате часто бывает сложно понять, как изменить структуру базы данных в процессе конвертации.

В нашем инструменте есть опция "Удалять имена схем в объектах SQL", которая позволяет выбрать, как имя схемы будет меняться в процессе миграции.

tips_tricks_schema_mapping_1

Есть 3 возможных значения этой опции:

  • "Да": в процессе миграции всех объектов имя схемы будет удалено. Будут сгенерированы все SQL-файлы с операторами CREATE, имя схемы добавляться не будет. Это значение установлено как значение по умолчанию.
  • "Нет": в процессе миграции будут сохранены все имена схем исходной базы данных.
  • "По умолчанию": в процессе миграции все имена схем исходной базы данных будут сохранены, а имена схем по умолчанию будут сопоставлены (например, для направления SQL Server в PostgreSQL схема 'dbo' будет преобразована в 'public').

В качестве примера, давайте возьмем два объекта SQL Server и посмотрим, как они будут преобразованы, если использовать разные значения опции.

Исходные объекты:

CREATE TABLE dbo.employees_tab
(
  emp_id INT,
  department VARCHAR(22),
  name VARCHAR(30),
  age INT,
  salary INT
)

create procedure schema1.salary_increase @dep_id varchar(22), @name varchar(30), @amount integer
as
UPDATE dbo.employees_tab SET salary = salary + @amount where department=@dep_id and name=@name

Теперь давайте сравним результаты миграции в базу данных PostgreSQL.

Значение опции — "Да":

CREATE TABLE employees_tab
(
   emp_id INTEGER,
   department VARCHAR(22),
   name VARCHAR(30),
   age INTEGER,
   salary INTEGER
);

create or replace PROCEDURE salary_increase(v_dep_id VARCHAR(22), v_name VARCHAR(30), v_amount INTEGER)
LANGUAGE plpgsql
   AS $$
BEGIN
   UPDATE employees_tab SET salary = salary+v_amount where department = v_dep_id and name = v_name;
END; $$;

Значение опции — "Нет":

CREATE TABLE dbo.employees_tab
(
   emp_id INTEGER,
   department VARCHAR(22),
   name VARCHAR(30),
   age INTEGER,
   salary INTEGER
);

create or replace PROCEDURE schema1.salary_increase(v_dep_id VARCHAR(22), v_name VARCHAR(30), v_amount INTEGER)
LANGUAGE plpgsql
   AS $$
BEGIN
   UPDATE dbo.employees_tab SET salary = salary+v_amount where department = v_dep_id and name = v_name;
END; $$;

Значение опции — "По умолчанию":

CREATE TABLE employees_tab
(
   emp_id INTEGER,
   department VARCHAR(22),
   name VARCHAR(30),
   age INTEGER,
   salary INTEGER
);

create or replace PROCEDURE schema1.salary_increase(v_dep_id VARCHAR(22), v_name VARCHAR(30), v_amount INTEGER)
LANGUAGE plpgsql
   AS $$
BEGIN
   UPDATE employees_tab SET salary = salary+v_amount where department = v_dep_id and name = v_name;
END; $$;

Если вы выберете значения "По умолчанию" и "Да", вы можете указать новую схему (опция “Изменить имена схем на”), в которой будут созданы все исходные объекты из всех схем.

Обратите внимание, что наш инструмент не создает схемы в целевой базе данных. Если вы используете значение "Нет" или "По умолчанию", вам необходимо вручную создать все схемы, отличные от значений по умолчанию, в целевой базе данных перед миграцией. Поэтому для различных тестов мы рекомендуем использовать значение "Да". В таком случае объект будет создан в схеме по умолчанию в целевой базе данных и проблем с отсутствием той или иной схемы в базе данных не возникнет.


Другие материалы по теме:
Как изменить имена объектов во время миграции
Советы и рекомендации

Если у вас есть вопросы, пожалуйста, обращайтесь в нашу службу поддержки: support@convertum.ru