Изменение схемы запроса обратного SQL - PullRequest
2 голосов
/ 23 августа 2011

Мне дан SQL-запрос, который определенным образом меняет схему базы данных.Как я могу создать SQL-запрос, который обратит изменение схемы данного запроса, так что выполнение исходного запроса и обратного запроса не окажет влияния на схему .

Например,с учетом

ALTER TABLE t ADD COLUMN a INTEGER

я произведу

ALTER TABLE t DROP COLUMN a

PS, я понимаю, что могу потерять некоторые данные, например, если я урону и создам столбец, данные там будут потеряны,Я могу выдержать это.

PS2, я полагаю, что могу посмотреть текущую схему, чтобы выяснить, какие были отброшенные столбец / таблицы.

PS3, общий ответ хорош, но специфичен для БДответы тоже в порядке.

Ответы [ 3 ]

2 голосов
/ 25 августа 2011

В общем случае вы не можете (по крайней мере, на PostgreSQL), если не выполните оператор CREATE TABLE. Например, допустим, вы начинаете с этой таблицы.

CREATE TABLE wibble (
  a INTEGER,
  b INTEGER,
  c VARCHAR(35),
  d DATE
);

Схема будет записана следующим образом.

CREATE TABLE wibble
(
  a integer,
  b integer,
  c character varying(35),
  d date
)

Затем вы отбрасываете столбец «а» и добавляете столбец «а».

ALTER TABLE wibble DROP COLUMN a;
ALTER TABLE wibble ADD COLUMN a INTEGER;

Теперь схема будет выглядеть следующим образом.

CREATE TABLE wibble
(
  b integer,
  c character varying(35),
  d date,
  a integer
)

Столбец "a" был первым столбцом; теперь это последнее. Это не имеет значения в реляционной теории или в SQL, потому что порядок столбцов не имеет значения. Однако для системы контроля версий это очень важно.

Удаление столбца может также отбрасывать ограничения, триггеры и индексы.

PostgreSQL также переписывает ваши операторы SQL DDL в каноническую форму. Например, вы можете написать что-то вроде этого.

CREATE TABLE wibble (
    a INTEGER PRIMARY KEY,
...

Но PostgreSQL будет хранить что-то вроде этого.

CREATE TABLE wibble
(
  a integer NOT NULL,
  . . .
  CONSTRAINT wibble_pkey PRIMARY KEY (a)
)
0 голосов
/ 26 августа 2011

Похоже, моя лучшая ставка на данный момент - применить изменение и выполнить runnign apgdiff в обеих схемах.

0 голосов
/ 25 августа 2011

Нет готового, встроенного решения для этого.Вам придется написать некоторый код, возможно, много.

Существует множество инструментов типа "схема различий".Вы могли бы использовать один из них.Например, создайте исходную схему, сделайте копию, запустите для нее команду изменения схемы, а затем запустите обратный diff схемы, который должен дать вам команду, которая отменяет первую команду.В зависимости от ваших точных требований, вы можете написать это в некоторой степени.Но это может быть грязно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...