Я разрабатываю приложение, использующее базу данных (PostgreSQL, MySQL, Oracle или MSSQL) в системе клиентов.Развернуть Sql Изменения в клиентских базах данных (измененные таблицы, функции, ...)
Поэтому мне нужно обновлять базы данных с каждой новой версией.
В настоящее время я нахожусь в концепции и не имею ничего работающего в производстве.
Все операторы DDL находятся в файлах сценариев.
структура выглядит следующим образом:
tables\employees.sql
customers.sql
orders.sql
Этих сценарии также в управления версиями и может быть использован для создания базы данных из натяжки.
Конечно, в будущем эти изменения будут иметь место в будущем.
Для примера таблицы сотрудники получает созданный, как это:
CREATE TABLE if not exists employees
(
EmployeeId serial,
FirstName text,
PRIMARY KEY (EmployeeId)
);
И в будущей версии этой таблицы получает продлен:
ALTER TABLE employees ADD COLUMN address varchar(30);
На моем исследовании я нашел этот пример: https://stackoverflow.com/posts/115422/revisions. Номер версии используется для выполнения определенных изменений.
Мне нравится эта концепция, и моя идея - реализовать что-то подобное. Но вместо номера версии системы я думал о введении версии для каждой таблицы.
При создании сотрудника таблицы он получает номер версии 1. При каждом изменении в этой таблице номер версии получает увеличивается на 1. После добавления адреса столбца (изменить заявление выше) версия таблицы будет 2 .
Каждое изменение таблицы будет происходить во вложенной транзакции, как это:
BEGIN TRANSACTION;
UPDATE employees SET Version = 2;
ALTER TABLE employees
ALTER TABLE employees ADD COLUMN address varchar(30);
END TRANSACTION;
Если версия таблицы ниже, чем текущая версия таблицы сделка будет откат. Побуждение этой логики еще предстоит сделать.
Преимущество состоит в том, что все изменения в таблице находятся внутри самого скриптового файла таблицы, и исходный оператор всегда обновляется.
Например, когда первый создающего сотрудника таблицы это будет выглядеть следующим образом:
сотрудников.SQL
CREATE TABLE if not exists employees
(
EmployeeId serial,
FirstName text,
Version int default 1 not null,
PRIMARY KEY (EmployeeId)
);
После некоторых изменений она выглядит следующим образом:
employees.sql
CREATE TABLE if not exists employees
(
EmployeeId serial,
FirstName varchar(100),
address varchar(80),
Version int default 3 not null, -- notice the 3
PRIMARY KEY (EmployeeId)
);
-- First Change
BEGIN TRANSACTION;
UPDATE employees SET Version = 2;
ALTER TABLE employees
ALTER TABLE employees ADD COLUMN address varchar(30);
END TRANSACTION;
-- Second Change
BEGIN TRANSACTION;
UPDATE employees SET Version = 3;
ALTER TABLE employees
ALTER COLUMN address TYPE varchar(80),
ALTER COLUMN FirstName TYPE varchar(100);
END TRANSACTION;
Это понятие приемлемо или я изобретать колесо здесь?
В MySQL любая команда DDL приведет к неявной фиксации , поэтому изменения DDL не могут быть откатны. Я не знаю, в чем ситуация для других dbs – Shadow
Вы правы, https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis – Tommy
Вы на правильном пути, но вы «Некоторые вещи отсутствуют. (Во-первых, возможность того, что изменения могут быть применены в неправильном порядке.) Веб-фреймворки, такие как Ruby Rails управляет этими вещами через * миграции *. Исследование того, как они это делают, сэкономит вам много времени. –