Маппинг схем
Каждая база данных имеет свою структуру. Например, "пользователь" и "схема" используются в Oracle для обозначения одного и того же; СУБД PostgreSQL позволяют создавать собственные схемы в каждой базе данных; в MySQL термин "схема" является синонимом "база данных". В результате часто бывает сложно понять, как изменить структуру базы данных в процессе конвертации.
В нашем инструменте есть опция "Удалять имена схем в объектах SQL", которая позволяет выбрать, как имя схемы будет меняться в процессе миграции.
Есть 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
