powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / СУБД. История изменений
71 сообщений из 71, показаны все 3 страниц
СУБД. История изменений
    #39271851
Andrey3k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разрабатываем проект с базой данных Oracle.

Как можно хранить историю изменений базы данных ? Например изменили структуру таблиц и процедуры, нужно это дело сохранить в системе контроля версий.

Предложите варианты и идеи.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39271856
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey3kПредложите варианты и идеи.
Как и в 100500 предыдущих топиков на эту темя я предлагаю оторвать у шаловливых ручек
право на изменение БД непосредственно, а в СКВ заносить скрипт изменения, который они
генерят и, соответственно, изменения в образцово-показательном скрипте создания БД с нуля.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39271867
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey3kРазрабатываем проект с базой данных Oracle.

Как можно хранить историю изменений базы данных ? Например изменили структуру таблиц и процедуры, нужно это дело сохранить в системе контроля версий.

Предложите варианты и идеи.

Гуглите по кейворду версионирование бд. Как пример liquibase.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39271880
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601Гуглите по кейворду версионирование бд. Как пример liquibase.необычная фамилия
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39272141
SAS2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey3kРазрабатываем проект с базой данных Oracle.

Как можно хранить историю изменений базы данных ? Например изменили структуру таблиц и процедуры, нужно это дело сохранить в системе контроля версий.

Предложите варианты и идеи.

По пробовать запустить аудит, создается таблица в базе (так же будет занимать место в бд) с этой табличкой можно будет делать все что хочешь, например отчет в виде html
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39272637
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> Как пример liquibase.

грустный пример
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39380590
Rudyshin Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

давно хотелось сделать нечто, что позволяло бы удобно работать с историей изменений объектов бд.
Разные Flyway, Liquibase не устраивали по разным причинам
Например, хранение версий в названиях файлов, приводит к конфликтам при слиянии веток. Не поддерживается нотация sqlplus.

если интересно, то интерактиный пример можно найти здесь
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39380879
Алекссс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не каждая компиляция процедуры нужна для фиксации ее версии, потому аудит отдельно, версии отдельно
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39380934
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shtock>> Как пример liquibase.

грустный примерПочему?
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39381103
Rudyshin Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> Почему?

ну вот сморю на главную страницу liquibase и читаю первые два пункта
Supports code branching and merging

Supports multiple developers

далее у них же читаю http://www.liquibase.org/documentation/changeset.html
Each changeSet tag is uniquely identified by the combination of the “id” tag, the “author” tag, and the changelog file classpath name. The id tag is only used as an identifier, it does not direct the order that changes are run and does not even have to be an integer. If you do not know or do not wish to save the actual author, simply use a placeholder value such as “UNKNOWN”.

Из-за этих ID, когда несколько разработчиков работают на разных ветках, приходится выдумывать правила, чтобы избегать конфликтов при мерджах.
И самое главное зачем вообще нужны эти идентификаторы?

Зачем нужно помещать автора в теги, если автор итак уже есть в системе контроля версий?
As Liquibase executes the databaseChangeLog, it reads the changeSets in order and, for each one, checks the “databasechangelog” table to see if the combination of id/author/filepath has been run. If it has been run, the changeSet will be skipped unless there is a true “runAlways” tag. After all the changes in the changeSet are run, Liquibase will insert a new row with the id/author/filepath along with an MD5Sum of the changeSet (see below) in the “databasechangelog”.

Возможность пропускать скрипты, которые были уже применеы к базе - это достатчно сомнительное удовольствие.
Эта возможность точно не для боевой базы. Так как сложно себе представить, что на базу накатывают версию и не зают, что накатывают, а тул сам пропускает некие скрипты.
М.б. еще имеет смысл хранить в базе номер версии, но не более.

Причем такой подход заставляет передавать каждый раз все скрипты за всю историю существования базы.
Попробуй ему не дать скрипт, который был применен год назад. Тул не даст накатить изменения.

Зачем это? Почему я не могу передать только изменения и номер версии к которой они применимы? Непонятно.
Liquibase attempts to execute each changeSet in a transaction that is committed at the end, or rolled back if there is an error. Some databases will auto-commit statements which interferes with this transaction setup and could lead to an unexpected database state. Therefore, it is usually best to have just one change per changeSet unless there is a group of non-auto-committing changes that you want applied as a transaction such as inserting data.
Весь этот абзац про то, что нужно как-то группировать изменения для того, чтобы избежать проблем в случае ошибок, в реальности не работает.
Если вы на боевую базу выкатываете релиз, который валится при установке, то как вы не группируйте изменения, но уже поздно.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39381378
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rudyshin SergeyИз-за этих ID, когда несколько разработчиков работают на разных ветках, приходится выдумывать правила, чтобы избегать конфликтов при мерджах.В любой более-менее адекватной команде разработки всегда существуют определенные правила и стандарты, в том числе и правила наименования.

Rudyshin SergeyИ самое главное зачем вообще нужны эти идентификаторы?Этот вопрос скорее всего означает то, что вы еще не пробовали использовать этот инструмент. Считайте, что каждый changeset - это некоторое атомарное изменение БД, т.е. транзакция. ID changeset-а необходим этом для того, чтобы отслеживать, накатывался ли он на данную БД или нет (+ привязка некоторых доп параметров, типа даты (последнего) выполнения). Для каждого примененного changeset-а в БД хранится его md5 для отслеживания того, не изменился ли changeset при следующем накате.

Rudyshin SergeyЗачем нужно помещать автора в теги, если автор итак уже есть в системе контроля версий?
Хотите остаться анонимным - никто не заставляет писать реально существующую где-либо учетную запись - пишите что-нибудь типа anonymous или defaultuser. А так этот атрибут, например, позволяет одним запросом получить список changeset-ов, созданных тем или иным юзверем, при условии, что они были применены к БД.

Rudyshin SergeyВозможность пропускать скрипты, которые были уже применеы к базе - это достатчно сомнительное удовольствие.
Эта возможность точно не для боевой базы. Так как сложно себе представить, что на базу накатывают версию и не зают, что накатывают, а тул сам пропускает некие скрипты. Опять налицо непонимание. Распишу подробнее. По умолчанию changeset накатывается на БД один раз (для удобства отнесем такие к первому типу). Но можно изменить это поведение, выставив например свойство runAlways=true (пусть это будет второй тип) или runOnChange=true (а это третий).
Вот пример, как этим можно пользоваться:

Необходимо накатить изменение, а именно - добавить поле в таблицу - для этого однозначно нужно использовать changeset первого типа с SQL alter table ...
Этот changeset выполнится однократно первый раз и будет скипаться при последующих накатах патча на эту БД.

Далее, необходимо изменить логику работу ХП с изменяемой нами таблицей (перенакатить измененный код) - тут можно использовать changeset-ы либо второго, либо третьего типа. При выставленном свойстве runOnChange=true он всегда выполнится первый раз и все последующие разы, если его текст (код ХП) изменился. При выставленном свойстве runAlways=true changeset будет выполняться при каждом накате вне зависимости от того, были ли в нем какие-либо изменения.
P.S.Выделенное жирным - не более, чем демагогия , уж простите.


Rudyshin SergeyПричем такой подход заставляет передавать каждый раз все скрипты за всю историю существования базы.
Подразумевает, но не обязывает. Вы всегда можете начать патчить БД c помощью liquibase не с начального состояния, но для этого нужно будет выполнить разовую синхронизацию метаданных на prod, test и dev-окружениях.

Rudyshin SergeyLiquibase attempts to execute each changeSet in a transaction that is committed at the end, or rolled back if there is an error. Some databases will auto-commit statements which interferes with this transaction setup and could lead to an unexpected database state. Therefore, it is usually best to have just one change per changeSet unless there is a group of non-auto-committing changes that you want applied as a transaction such as inserting data.
Весь этот абзац про то, что нужно как-то группировать изменения для того, чтобы избежать проблем в случае ошибок, в реальности не работает.
Если вы на боевую базу выкатываете релиз, который валится при установке, то как вы не группируйте изменения, но уже поздно.Вам никто и не говорит, что в случае ошибки этот tool сам за вас все исправит. И никакой другой инструмент не застрахует вас от ошибок.
Если в процессе наката вылезла ошибка (не хватило прав, места или что-то в этом роде), то после устранения причины проблемы вы просто повторно запускаете накат патча и он продолжит с того места, на котором он упал (при этом не забываем рекомендации по атомарности changeset-ов). Ошибки же другого рода должны отлавливаться на test-контуре, на который все изменения накатываются посредством того же самого патча.

Также есть возможность определения rollback-сценариев, но на практике мы их не используем.

Таким образом, правильно построенные патчи, при условии, что все изменения метаданных БД производятся только через пачти и никто не лазит в БД своими шаловливыми ручками с DDL-командами напрямую, дают гарантию целостности. При многократном накате патча (или патчей - логически вы можете делить их как захотите) на одну и ту же БД накатываются только те changeset-ы, необходимость которых вы явно выставите с помощью перечисленных мною выше атрибутов.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39381394
Демагог
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKad, sql оборачивать в xml... очень все трудно.
Мы в один файл.sql все пишем и из него накатываем. А этот ваш ликвибейз, там ант, мавен и прочее нужно. Очень муторно.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39381415
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДемагогAmKad, sql оборачивать в xml... очень все трудно.
Мы в один файл.sql все пишем и из него накатываем. А этот ваш ликвибейз, там ант, мавен и прочее нужно. Очень муторно.Ликви берет и SQL
Код: plsql
1.
2.
3.
--liquibase formatted sql
...
и пошел писать changeset-ы


без пролем...
Но AmKad очень все красиво описал... респект...
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39381473
Демагог
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владимир СА, спасибо, буду знать!
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39381856
Rudyshin Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> В любой более-менее адекватной команде разработки всегда существуют определенные правила и стандарты, в том числе и правила наименования.

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

>Хотите остаться анонимным - никто не заставляет писать реально существующую где-либо учетную запись - пишите что-нибудь типа anonymous или defaultuser. А так этот атрибут, например, позволяет одним запросом получить список changeset-ов, созданных тем или иным юзверем, при условии, что они были применены к БД.

Git позволяет гараздо больше. На мой взгляд историю изменений лучше оставить специализированному тулу.

>Далее, необходимо изменить логику работу ХП с изменяемой нами таблицей (перенакатить измененный код) - тут можно использовать changeset-ы либо второго, либо третьего типа.

А теперь представьте, что процедура вызвается в нескольких changeset-ах.
Вы накатываете базу с "нуля".
В поставке последняя версия процедуры. Положим v0.42.
Вначале накатывается changeset v0.1, который вызывает версию процедуры v0.42.
Хотя когда-то changeset v0.1 вызывал процедуру версии v0.1
Это кажется неправильным.
Решением в данном случае будет хранить все версии процедуры в отдельных файлах.
Что кажется, как минимум избыточным.

> Если в процессе наката вылезла ошибка (не хватило прав, места или что-то в этом роде), то после устранения причины проблемы вы просто повторно запускаете накат патча и он продолжит с того места

Если в процессе наката на боевой базе возникла ошибка, то может что-то в консерватории подправить?
Не должно быть никаких ошибок на боевой базе. Все должно быть оттестировано до.
Более того, на мой взгляд скрипты не должны быть Idempotent.
А наоборот должны быть https://en.wikipedia.org/wiki/Fail-fast
Не должны скрипты проверять, что они уже выполнились, так как это повышает вероятность ошибок.
Особенно при работе на ветках разными разработчиками.
Эта idempotence - это по сути "exception when others then null; end;"
"exception when then others null; end;" - тоже работает некоторое время ...

> Также есть возможность определения rollback-сценариев, но на практике мы их не используем.

вот именно, еще одно бесполезная фича

> Таким образом, правильно построенные патчи, при условии, что все изменения метаданных БД производятся только через пачти и никто не лазит в БД своими шаловливыми ручками с DDL-командами напрямую, дают гарантию целостности

Согласен и предлагаю рассмотреть пример, в котором не используются ни идентификаторы, ни liqubase
но тем не менее позволяет делать все тоже самое

Разработчик Иван на бранче JIRA-001 создал файл JIRA-001.sql и добавил его вызов в patch.sql

Код: html
1.
2.
3.
4.
5.
JIRA-001.sql
create table a (n number);

patch.sql
@JIRA-001.sql



Разработчик Петр на бранче JIRA-002
Код: html
1.
2.
3.
4.
5.
JIRA-002.sql
create table b (n number);

patch.sql
@JIRA-002.sql



У каждого разработчика есть образ виртуальной машины, который соответствет версии боевой базы.
Каждый из них проверили работоспособность своих скриптов.
Отдали руководителю на интеграцию.
Изменения были смерджины и протестированы
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
JIRA-001.sql
create table a (n number);

JIRA-002.sql
create table b (n number);

patch.sql
@JIRA-002.sql
@JIRA-001.sql



Какие проблемы есть у Ивана и Петра, и почему они должны начать использовать liqubase?
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382255
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rudyshin Sergeyмой тезис в том, что можно обойтись без идентифиторов в данном случаеЯ показал, для чего нужны идентификаторы. Если Вы по-прежнему настаиваете на том, что они не нужны, то Ваш тезис в том, что в БД не должна трекаться информация о примененных changeset-ах.

Rudyshin SergeyGit позволяет гараздо больше. На мой взгляд историю изменений лучше оставить специализированному тулу.Само собой, все changeset-ы (а соответственно и sql-скрипты) хранятся в системе контроля версий, поэтому и нет необходимости хранить все версии recreatable-объектов (view, procedure, function, package, type и т.д) в отдельных файлах. Достаточно хранить только актуальную, а все предыдущие при необходимости можно будет поднять по СКВ.

Rudyshin SergeyА теперь представьте, что процедура вызвается в нескольких changeset-ах.
Вы накатываете базу с "нуля".
В поставке последняя версия процедуры. Положим v0.42.
Вначале накатывается changeset v0.1, который вызывает версию процедуры v0.42.
Хотя когда-то changeset v0.1 вызывал процедуру версии v0.1
Это кажется неправильным.
Решением в данном случае будет хранить все версии процедуры в отдельных файлах.
Что кажется, как минимум избыточным.Не понял примера - можно понять по-разному. Соответственно не понимаю необходимости "хранить все версии процедуры в отдельных файлах".

Rudyshin SergeyНе должно быть никаких ошибок на боевой базе. Все должно быть оттестировано до.Конечно, но всегда есть человеческий фактор. Например, недооценили объем индекса на реальных данных. На тесте индекс создался, а на проде создание индекса упало, так как под него не был выделен достаточный объем.

Rudyshin SergeyБолее того, на мой взгляд скрипты не должны быть IdempotentТеперь мы должны пойти и дать по пальцам разработчику, добавившему команду "alter table move tablespace" только потому, что она, видите ли, Idempotent. И обязать всех вместо "create or replace" писать либо "create", либо "replace". И явную перекомпиляцию хранимого кода ввиду изменения зависимостей запускать запретим.
Если же хотите, чтобы каждый changeset накатывался только один раз, то пожалуйста, liquibase дает Вам возможность управлять этим свойством. Об этом я писал в своем предыдущем посте.

Rudyshin SergeyНе должны скрипты проверять, что они уже выполнились, так как это повышает вероятность ошибок.Мои скрипты ни о каких проверках и не знают, за меня это делает liquibase.

Rudyshin SergeyЭта idempotence - это по сути "exception when others then null; end;"Скорее всего Вы не поняли возможность управления свойствами runAlways и runOnChange. И вообще об отсутствии таковых. Об этом было в моем предыдущем посте. Liquibase не глотает ошибок.

Rudyshin Sergeyвот именно, еще одно бесполезная фичаТут ничего не могу сказать, так как ни разу еще не задумывался о необходимости ее использования. Допускаю, что можно найти сценарии, где это могло бы пригодиться.

Rudyshin SergeyКакие проблемы есть у Ивана и Петра, и почему они должны начать использовать liqubase?Совсем не обязательно у этих парней будут проблемы, но:
1) Данный патч не имеет возможности "повторного наката". При попытке повторного наката свалитесь на каждом "неповторяемом" statement-е. Возможность повторного наката - это не просто сферический конь в вакууме. Это не только возможность накатить версию базы с V10 на V11 (где V11 - актуальная), но и возможность накатить с помощью этого же patchset-а состояния других баз с любых других версий (с V0 на V11, с V5 на V11 и т.д.).
2) Если по какой-то причине (оборвалась связь с БД, нехватка места, выключили свет) выполнится только @JIRA-002.sql, а @JIRA-001.sql нет, то после устранения причины проблемы для продолжения наката Вам необходимо будет править файл patch.sql, комментируя вызов @JIRA-002.sql. В случае с liquibase он сам отследит выполненные changeset-ы и продолжит накат с того места, где был обрыв/падение. Никакой правки в файлах патча не требуется.
3) Если после наката патча кто-то шаловливыми ручками поправит "неповторяемый" changeset, то при попытке последующего (пере-)наката на эту же БД liquibase ругнется, и выдаст соотв-е сообщение и не начнет накат.
4) В liquibase я могу единожды выполнить настройку, которая будет запускать при каждом накате на dev и test-контурах unit-тесты, и игнорировать их запуск на проде. (Это частный пример того, что на уровне каждого changeset-а я могу выставить свойство context и управлять необходимостью его запуска на том или ином контуре).
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382513
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey3kРазрабатываем проект с базой данных Oracle.

Как можно хранить историю изменений базы данных ? Например изменили структуру таблиц и процедуры, нужно это дело сохранить в системе контроля версий.

Предложите варианты и идеи.

ты вполне можешь генерировать структуру базы данных в текстовом виде (через DBMS_METADATA) и складировать ее в текстовые файлы, которые отправлять в SVN или GIT

отдельно можно настроить экспорт DBA_AUDIT_STATEMENTS, в пределах объектов - там будет видно, кто "создавал" или "заменял" объект за прошлый день - эти данные можно как коммент к комитту прикреплять.

аналогично можно выгружать в текстовый вид и данные статичных справочников


это если в варианте постфактум.

а так да, нужно привинтить систему контроля изменений версий "до", но нормальных решений в свободном доступе практически нет, упомянутые liquebase и подобные отражения подходов из известной книжки refactoring databases категорически не совместимы с базовой идеей VCS систем, особенно если у тебя бренчи, бекмержи и подобное.

очень неплох Oracle ODF/XDF тулчейн из OEBS, но это для избранных, отдельно он ИМНИП не поставляется
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382525
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadСамо собой, все changeset-ы (а соответственно и sql-скрипты) хранятся в системе контроля версий, поэтому и нет необходимости хранить все версии recreatable-объектов (view, procedure, function, package, type и т.д) в отдельных файлах. Достаточно хранить только актуальную, а все предыдущие при необходимости можно будет поднять по СКВ.


Садись, два.

Почему два? Ок. У тебя есть сприпт миграции, jira-002412.sql. Который делает UPDATE, используя вызов функции из специфической редакции пакета PKG_MYSUPERPUPERLOGIC. Скажем версии v223

А у тебя в дистрибутиве поставляется версия последняя пакета, допустим v301. Но скрипт миграции требует именно v223 - там допустим определенный набор параметров функции или поведение, которое сильно изменено в 301, или вообще убрано.

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

Правда ситуация становится совсем веселой, когда в v223 обнаруживается несовместимый с жизнью баг (который новую версию Oracle отправляет в ORA-0600, и который был зачинен только в 301-й).

А так да, идея что все recreatable объекты надо поставлять только последней версии - она очень привлекательна, в теории.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382554
казинак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey3kРазрабатываем проект с базой данных Oracle.

Как можно хранить историю изменений базы данных ? Например изменили структуру таблиц и процедуры, нужно это дело сохранить в системе контроля версий.

Предложите варианты и идеи.
история изменений и так в архивлогах есть
https://docs.oracle.com/database/121/SUTIL/GUID-E0DDC97C-7364-4BED-AF2A-E0B486F0E22F.htm
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382566
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchСадись, два.

Почему два? Ок. У тебя есть сприпт миграции, jira-002412.sql. Который делает UPDATE, используя вызов функции из специфической редакции пакета PKG_MYSUPERPUPERLOGIC. Скажем версии v223

А у тебя в дистрибутиве поставляется версия последняя пакета, допустим v301. Но скрипт миграции требует именно v223 - там допустим определенный набор параметров функции или поведение, которое сильно изменено в 301, или вообще убрано.

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

Правда ситуация становится совсем веселой, когда в v223 обнаруживается несовместимый с жизнью баг (который новую версию Oracle отправляет в ORA-0600, и который был зачинен только в 301-й).

А так да, идея что все recreatable объекты надо поставлять только последней версии - она очень привлекательна, в теории.И? Никто не мешает тебе возить с собой все необходимые версии пакетов, а также выкатывать и запускать их в нужном порядке.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382574
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadИ? Никто не мешает тебе возить с собой все необходимые версии пакетов, а также выкатывать и запускать их в нужном порядке.

ты только что утверждал, что нужно возить только самые последние версии, остальные дескать сидят в VCS.

а так - кто определит зависимости нужных версий? пакет-то может быть вовсе не standalone, и быть завязан на еще 100500 объектов из схемы, их тоже следовательно нужно возить строго нужных версий, а как это трекать, какую версию в какой момент времени применять?

ты походу или теоретик, или просто поговорить хочешь?
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382590
казинак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad...Возможность повторного наката - это не просто сферический конь в вакууме. Это не только возможность накатить версию базы с V10 на V11 (где V11 - актуальная), но и возможность накатить с помощью этого же patchset-а состояния других баз с любых других версий (с V0 на V11, с V5 на V11 и т.д.)....
это именно конь в вакууме...
на практике этим никто не заморачивается...
чтобы повторно накатить, просто восстанавливается система с бэкапа
и это можно делать не раз, но только на тесте
и только потом на прод

а уж накат с любой версии на любую - это вообще нереальная фигня
тот же оракл не поддерживает прямой апгрейд скажем с 8-й версии на 11-ю

ну т.е. можно конечно тратить время на то, чтоб пытаться делать патчи реентерабельными да еще и суперуниверсальными, типа, с любой версии на любую, но этой херней занимаются только конченные чудаки.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382593
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchAmKadИ? Никто не мешает тебе возить с собой все необходимые версии пакетов, а также выкатывать и запускать их в нужном порядке.

ты только что утверждал, что нужно возить только самые последние версии, остальные дескать сидят в VCS.
Если ты посмотришь внимательнее, то это мой был ответ Rudyshin Sergey о том, что liquibase не берет на себя обязанность хранения всех версий объектов и вполне нормально, что этим занимается СКВ. Если в процессе наката патча необходимо использовать несколько версий - то с этим, как я уже сказал, проблем нет.

dbpatchа так - кто определит зависимости нужных версий? пакет-то может быть вовсе не standalone, и быть завязан на еще 100500 объектов из схемы, их тоже следовательно нужно возить строго нужных версий, а как это трекать, какую версию в какой момент времени применять?А это уже выходит за рамки обсуждения того, какую систему патчей использовать: liquibase или голые .sql файлы.
Liquibase определением зависимостей не занимается.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382600
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKaddbpatchпропущено...


ты только что утверждал, что нужно возить только самые последние версии, остальные дескать сидят в VCS.
Если ты посмотришь внимательнее, то это мой был ответ Rudyshin Sergey о том, что liquibase не берет на себя обязанность хранения всех версий объектов
Как раз наоборот - в их идеологии ты обязан вносить каждое изменение объекта в свой отдельный пронумерованный файл, и возить это потом с собой. Ну понятное дело, что если ты в течении дня сделал over 9000 изменений пакета, то тебе не нужно делать 9000 файлов, но то что ушло в деплой - уже всё, статик файл, менять нельзя, ибо зависимости.

AmKadи вполне нормально, что этим занимается СКВ. Если в процессе наката патча необходимо использовать несколько версий - то с этим, как я уже сказал, проблем нет.

VCS (GIT, SVN, etc) вообще не имеет смысла в случае подхода liquebase - потому что у тебя статик файл - после релиза содержание файла уже не меняется никогда. т.е. ликвибейз берет на себя функцию VCS.

И ладно бы брал привычным способом - так там ни blame толком не сделать, а в случе backmerge можно вообще застрелиться.


AmKadLiquibase определением зависимостей не занимается.
как раз занимается, это ты просто не осилил его документацию и примеры, ну и книжку прамодкумара.

садись два, еще раз.

зачем лезть в спор, если матчасть не освоена?
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382606
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
казинакэто именно конь в вакууме...
на практике этим никто не заморачивается...
чтобы повторно накатить, просто восстанавливается система с бэкапа
Восстановиться из бакапа - это значит похерить данные текущей бд. А когда эта реальна работающая БД у одного из типовых заказчиков и данные терять не хочется?

автора уж накат с любой версии на любую - это вообще нереальная фигняНу вообще-то я не говорил "на любую". Я говорил "с любой". Хотя можно заморочиться и "на любую".

авторну т.е. можно конечно тратить время на то, чтоб пытаться делать патчи реентерабельными да еще и суперуниверсальными, типа, с любой версии на любую, но этой херней занимаются только конченные чудаки.Представь себе, по трудоемкости и сложности это не сильно отличается от последовательного добавления sql-статементов в .sql-файлы.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382613
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadавторну т.е. можно конечно тратить время на то, чтоб пытаться делать патчи реентерабельными да еще и суперуниверсальными, типа, с любой версии на любую, но этой херней занимаются только конченные чудаки.Представь себе, по трудоемкости и сложности это не сильно отличается от последовательного добавления sql-статементов в .sql-файлы.

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

команда даже примет это громогласным ура!

но в один прекрасный день в файл миграции или зависимость на юзерский пакет вкомиттят, или под DECLARE поселят пару мегабайт глючной копипасты.

а реентерабельность - очень прикольно звучит в случае рефакторинга вида "разделение структуры таблицы на две отдельные таблицы", или даже простейшего "партицирование таблицы".

хотя да, реентерабельно индексы строить или констрейны прикручивать, ту да, это как два пальца - пищем PL/SQL обертки и вперед.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382635
svn_ora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbpatch,
Вы какие инструменты используете/советуете?
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382642
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchVCS (GIT, SVN, etc) вообще не имеет смысла в случае подхода liquebase - потому что у тебя статик файл - после релиза содержание файла уже не меняется никогда. т.е. ликвибейз берет на себя функцию VCS.Неправда.

dbpatchну и книжку прамодкумара.NoSql? Нет, не читал.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382650
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchэто только в теории. в теории можно рассказать про то, что миграции должны делаться только автономными файлами и не иметь внешних зависимостей
Не знаю, что ты понимаешь под внешними зависимостями.

dbpatchно в один прекрасный день в файл миграции или зависимость на юзерский пакет вкомиттят, или под DECLARE поселят пару мегабайт глючной копипасты.Причем тут система наката патчей?

dbpatchа реентерабельность - очень прикольно звучит в случае рефакторинга вида "разделение структуры таблицы на две отдельные таблицы", или даже простейшего "партицирование таблицы".

хотя да, реентерабельно индексы строить или констрейны прикручивать, ту да, это как два пальца - пищем PL/SQL обертки и вперед.Если ты используешь "реентерабельность" при накате констрайнтов и репартиционировании - то и флаг тебе в руки.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382655
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svn_oradbpatch,
Вы какие инструменты используете/советуете?
как я говорил выше - единственно правильным является Oracle XDF/ODF фреймфорк.
подход ликвибейза - он настолько неудобен, что пользовать им могут разве идейные мазохисты.

а по факту рабочим вариантом является следующее:

реентерабильные .SQL файлы, в т.е. CREATE PROCEDURE, VIEW, PACKAGE и прочее хранится просто как именованыне .SQL файлы, где именем файла является имя объекта, без нумераций. несколько объектов в один файл не допустимо, ну кроме случая PACKAGE и его BODY.

эти файлы генерятся прямо из базы данных специальной PL/SQL процедурой, программисту не нужно копипастить.

отдельно эти все файлы разбиты по каталогам, по подсистемам, так искать проще (не всегда в имени объекта префиксом зашито имя подсистемы/модуля).

это все делается чтоб воспринимать код базы данных как любой иной (Java, C++, PHP) код и пользоваться blame, merge привычным способом

CREATE TABLE и CREATE INDEX, ALTER TABLE - в настоящее время делаются через специальные PL/SQL вызовы, суть которых в том, чтоб проверить - если есть индекс, и его структура как в вызове - то ничего не делать, иначе перестроить и т.п.
эти вызовы сидят в .sql файле с именем таблицы, т.е. хранится только последнее актуальное состояние таблицы (реентерабельность -же!). эти файлы тоже генерятся.

т.е. цель - обеспечить реентерабельность патча (логика или пересоздать, или скипнуть) прошита изначально.

а вот миграции данных - это да, боль еще та. если они тривиальные и без зависимостей - то они делаются реентерабельными, за этим следит специально обученный человек релизер.

если скрипты миграции не реентерабельны, или требуют строго специфической версии базы данных на которую они накатываются - то они из патча выносятся в отдельно выполняемые вручную файлы, которые подшивают в release notes/steps (бывают pre и post разновидности)

типо если вот хотите обновиться - берете эти файлы и выполняете вручную (если упали - то разбор полетов отдельно, вплоть до flashbask restore)

слава богу, что примерно 99% всех миграций - они тривиальны и реентерабельны, особенно в случае пострелизных быстрых багфиксов.

со статичным справочниками тот-же подход - их наполнение прошивается в специальные PL/SQL вызовы, кладется в .SQL файлы и работает по принципу - или добавь, или обнови, или ничего не делай, если запись уже на месте.
файлы, естественно, тоже генерятся из базы, а вот PL/SQL код наполнения лежит, естественно, в отдельных .SQL файлах, они гарантированно выполняются первыми (есть еще понятие стадий и проходов, это отдельная тема)

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

или же накатываются только те файлы, которые изменились от последнего релиза, если схема не пустая - хотя можно и все целиком накатить (реэнтерабельно же все), но когда у тебя объектов более 1000, то процедура накатки всех файлов в которых реально и не было изменений начинает занимать порой десятки минут, это неудобно.

тулы все самописные (bash и sqlplus), готовых нормальных не нашлось
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382658
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKaddbpatchэто только в теории. в теории можно рассказать про то, что миграции должны делаться только автономными файлами и не иметь внешних зависимостей
Не знаю, что ты понимаешь под внешними зависимостями.

господи, ты стоишь на .SQL файле, в нем некий код. этот код или вызывает некий иной PL/SQL код, который лежит в других .SQL файлах этого же патча (внешняя зависимость по отношению к текущему файлу), или нет - он полностью автономен, и вызвает только то, что в Oracle изначально доступно.


на остальные твои "флаг" в руки отвечать лениво и бессмысленно, ты просто не в теме.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382667
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchCREATE TABLE и CREATE INDEX, ALTER TABLE - в настоящее время делаются через специальные PL/SQL вызовы, суть которых в том, чтоб проверить - если есть индекс, и его структура как в вызове - то ничего не делать, иначе перестроить и т.п.
эти вызовы сидят в .sql файле с именем таблицы, т.е. хранится только последнее актуальное состояние таблицы (реентерабельность -же!). эти файлы тоже генерятся.
Попытался представить себе сигнатуру и тело pl/sql обертки для создания индекса. Ты проверяешь только набор и порядок полей? Уникальность/неуникальность? Или еще такие параметры tablespace, pctfree, next и т.д.?

А при добавлении поля. Проверяешь размерность, null/not null, lob store as, storage in row ... и т.д.?

Или еще лучше - добавление check-constraint-а? Проверяешь там текст?
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382677
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchт.е. цель - обеспечить реентерабельность патча (логика или пересоздать, или скипнуть)
Не реентерабельность, а идемпотентность.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382680
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKaddbpatchCREATE TABLE и CREATE INDEX, ALTER TABLE - в настоящее время делаются через специальные PL/SQL вызовы, суть которых в том, чтоб проверить - если есть индекс, и его структура как в вызове - то ничего не делать, иначе перестроить и т.п.
эти вызовы сидят в .sql файле с именем таблицы, т.е. хранится только последнее актуальное состояние таблицы (реентерабельность -же!). эти файлы тоже генерятся.
Попытался представить себе сигнатуру и тело pl/sql обертки для создания индекса. Ты проверяешь только набор и порядок полей? Уникальность/неуникальность? Или еще такие параметры tablespace, pctfree, next и т.д.?

А при добавлении поля. Проверяешь размерность, null/not null, lob store as, storage in row ... и т.д.?

Или еще лучше - добавление check-constraint-а? Проверяешь там текст?

параметры аж три штуки

имя таблицы,
имя индекса
column expression (там могут быть FBI, DESC и прочее).

уникальность не уникальность - это имя процедуры - .idx() или .uk(), .pk()

тонкости вида чем отличается UNIQUE INDEX от UNIQUE CONSTRAINT в рамках проекта задавили, чтоб не смущать сильно сумлевающихся - всем ходить в констрейн.

локальность или не локальность индекса определяется автоматом из набора колонок.

глобально партицированные индексы ни разу не понадобились, было решено что это все от лукавого.

параметры сториджа берутся по дефолту от тейблспейса, а сам тейблспейс от юзера.
практически никому не нужны эти тонкие материи, а кому сильно надо - тот сам потом руками сделает MOVE/REBUILD, как считает нужным.

единственное место, где есть деление тейблспейсов - это партицирование по периодам (годам), с целью пометки оных тейблспейсов как R/O.

но это делается отдельным фреймворком datalifecycle management, патч с ним перпендикулярен - в случае новой таблицы патч создает только изначальную партицию, остальные по датам добавляет уже другой пакет/набор джоб.


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

какое-то время с этим мучались, но недостатки превысили бенефиты - при ресторе ребилд
индексов занял неприемлимое по SLA время, а пару раз вообще не прошел, потому что TEMP
не хватило, потому вкинувшего идею хранить индексы отдельно и не бекапить/ресторить - публично перед строем сильно поругали.

на этом эпопея отдельного тейблспейса для индексов была выкинута - в современных SAN и SSD условиях это полная бессмыслица даже для перфоманса.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382681
Lary Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatch, сложилось ощущение, что AmKad работал с ликвибейзом и понимает, о чем пишет. Твои доводы ПРОТИВ, не совсем понятны. Ты скорее философ. А спорить с философом, себе дороже. Вы живете в своем мире.

Всегда можно беседу в ключе:

- Воду можно перенести в ведре
- А если в нем будет дырка?
- Надо взять ведро без дырки
- А если температура окружающей среды будет выше температуры плавления материала, из которого сделано ведро?

и т.д
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382687
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lary Denisdbpatch, сложилось ощущение, что AmKad работал с ликвибейзом и понимает, о чем пишет. Твои доводы ПРОТИВ, не совсем понятны.
нет, ты просто не можешь понять, как можно иначе. вот AmKad что-то уже начал понимать, видно у него не полный ликвибейз головного мозга (или он просто не совсем его понимает, это мы уже выяснили ранее).

Lary Denis Ты скорее философ. А спорить с философом, себе дороже. Вы живете в своем мире.

Вообще-то я сугубо практик, причем прожженный и циничный. И стадию ликвибейза уже давно прошел и выкинул, как архаичный атавизм и искревление сознания вида досадного затмения (и даже не могу сказать, зачем вообще так делали, скорее просто было так принято).

А если ты что-то не осознал из сказанного мной выше - ну... ок, просто твой взгляд на мир ограничен теми рамками, в которых ты эффективен и выход за оные, переход на следующий уровень - тебя пугает, это нормально для 95% популяции людей, вне зависимости от их специализации.

В средние века вон таких как я "философов" за подобные откровения на кострах жгли, ибо зачем думать-то, проще не думать и сразу объявить ересью :)
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382691
Lary Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatch, ты (Вы) с легкой руки вешаешь (те) ярлыки на людей. "этот не понял", "ты боишься", "ты не хочешь думать".

Приятно поговорить не только с философом, но и с психологом и телепатом. Сталкиваясь с Liquibase в своей практике, не испытал дискомфорта.
А скорее, как педант, остался очень им доволен.

А вот раз у тебя (Вас) такое негативное мнение о нем, быть может ты (Вы) его не понял (ли)?
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382694
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchА при добавлении поля. Проверяешь размерность, null/not null, lob store as, storage in row ... и т.д.?

Размерность, тип (если колонка пуста, то тип меняется автоматом), null/not null - да, еще DEFAULT значение.
Все параметры сториджа не проверяются - см. выше про сториджи, не патча это дело ковыряться с физикой, кому надо - сам потом поправит после патча.
Даже параметры партицирования не прописываются - проще отдельными PL/SQL вызовами сделать отдельную миграцию пустой таблицы в партицированную, если сильно нужно.

Смысл патча не только в реентерабельности, но и в гарантированном времени выполнения - это важно для пострелизных фиксов, которые выполняются по SLA не в выходные, а по требованию, т.е. должны занимать минуты, а не часы, т.е. не делать никаких неожиданных массированных миграций и ребилдов (делать только руками, если явно попросят).

dbpatchИли еще лучше - добавление check-constraint-а? Проверяешь там текст?
да, просто проверяется текст. если trim()-ed версии не совпадают - то пересоздается.


отдельно - в настоящее время не шатко валко прорабатывается вопрос вообще избавиться от PL/SQL вызовов, и хранить только plain text вида

CREATE TABLE, ALTER TABLE, CREATE INDEX

уже отдельно по BNF его парсить и выдавать нужные ALTER TABLE ADD/MODIFY COLUMN, но, как говорится, "это тема моей будущей докторской диссертации".

да и через bash/sqlplus такой парсинг уже не сделать, нужно применять более тяжелые вещества средства

хотя потенциально эта идея интересна - можно сразу сторидж параметры прописывать, и прочие хитрости.
если таблицы нет - то ее даже не надо целиком парсить - просто создать точно так, как в файле как написано.

а вот реентерабельной логикой только сравнивать наборы и типы колонок если таблица уже в базе данных, скипая всю хитрую часть в части сториджа и прочих партицирований (см. выше про гарантированное время применения)
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382697
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lary DenisСталкиваясь с Liquibase в своей практике, не испытал дискомфорта.
А скорее, как педант, остался очень им доволен.

Это явление не ново. Вот тут описано: https://ru.wikipedia.org/wiki/Луддиты
И гордиться подобным я бы не стал.

Lary DenisА вот раз у тебя (Вас) такое негативное мнение о нем, быть может ты (Вы) его не понял (ли)?
Я описал явно выше, почему он не приемлем.

В нем практически невозможно делать blame (вернее ОЧЕНЬ затруднено) и совсем невозможно делать backmerge/merge - эти процедуры занимают часы, иногда дни, особенно для больших проектов, при этом качество результата практически всегда низкое и негарантированное.

Но если для тебя слова backmerge и blame пустой звук (это нормально для большинства проектов, которые делаются для одного заказчика и актуальна только самая последняя версия), то подход с 0000123412.sql очень даже работоспособен, тут даже спорить не нужно.

Яб конечно еще спросил, как вы делаете rollback.sql-ы, но думаю не стоит, ибо столько иронии в ответ ты, пожалуй, можешь и не выдержать :)
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382699
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нахлобучdbpatchт.е. цель - обеспечить реентерабельность патча (логика или пересоздать, или скипнуть)
Не реентерабельность, а идемпотентность.

да да, потентность.

результаты не всегда неизменны, смысл реентерабельности патча в схеме "накатывали патч, упали, руками подчинили, накатили еще раз".
причем руками починили часто не только базу, но и сам патч, потому про идемпотенцию :) я бы не стал говорить, это сильно сильное слово.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382928
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchрезультаты не всегда неизменныТогда совсем грусть-тоска.

dbpatchсмысл реентерабельности патча в схеме "накатывали патч, упали, руками подчинили, накатили еще раз".И даже это поведение -- ни разу не про реентерабельность.

dbpatchпричем руками починили часто не только базу, но и сам патч, потому про идемпотенцию :) я бы не стал говорить, это сильно сильное слово.Всё тлен. Патчи должны быть оттестированы и накатываться без правок и "починок" базы. Я, конечно, понимаю, что Oracle не умеет транзакционный DDL, но это не повод.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382973
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нахлобучdbpatchсмысл реентерабельности патча в схеме "накатывали патч, упали, руками подчинили, накатили еще раз".И даже это поведение -- ни разу не про реентерабельность.

Ты прав, термин неудачный и в данном топике был вброшен не мной.
Я сам называю это свойство способностью к перезапуску (restartable), перезапускаемость.

реентерабельность это ЕМНИП скорее из мира POSIX, способность функции к повторому запуску при прерывании на обработку сигнала

Нахлобучdbpatchпричем руками починили часто не только базу, но и сам патч, потому про идемпотенцию :) я бы не стал говорить, это сильно сильное слово.Всё тлен. Патчи должны быть оттестированы и накатываться без правок и "починок" базы. Я, конечно, понимаю, что Oracle не умеет транзакционный DDL, но это не повод.

причины бывают разные. наиболее типовая - это просто закончилось место (в датафайлах, в TEMP или в UNDO). или патч занимает внезапно неожиданно большое время на миграциях.

или падучая на констрейнах.

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

а так да, правило - перед релизом тестируем патч на восстановленной из бекапа копии прода - никто не отменял, но много людей его в реальности соблюдает?
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382981
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchпараметры аж три штуки

имя таблицы,
имя индекса
column expression (там могут быть FBI, DESC и прочее).

уникальность не уникальность - это имя процедуры - .idx() или .uk(), .pk()

тонкости вида чем отличается UNIQUE INDEX от UNIQUE CONSTRAINT в рамках проекта задавили, чтоб не смущать сильно сумлевающихся - всем ходить в констрейн.

локальность или не локальность индекса определяется автоматом из набора колонок.

глобально партицированные индексы ни разу не понадобились, было решено что это все от лукавого.

параметры сториджа берутся по дефолту от тейблспейса, а сам тейблспейс от юзера.
практически никому не нужны эти тонкие материи, а кому сильно надо - тот сам потом руками сделает MOVE/REBUILD, как считает нужным.

единственное место, где есть деление тейблспейсов - это партицирование по периодам (годам), с целью пометки оных тейблспейсов как R/O.

но это делается отдельным фреймворком datalifecycle management, патч с ним перпендикулярен - в случае новой таблицы патч создает только изначальную партицию, остальные по датам добавляет уже другой пакет/набор джоб.


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

какое-то время с этим мучались, но недостатки превысили бенефиты - при ресторе ребилд
индексов занял неприемлимое по SLA время, а пару раз вообще не прошел, потому что TEMP
не хватило, потому вкинувшего идею хранить индексы отдельно и не бекапить/ресторить - публично перед строем сильно поругали.

на этом эпопея отдельного тейблспейса для индексов была выкинута - в современных SAN и SSD условиях это полная бессмыслица даже для перфоманса.Ну и зачем такой недовелосипед (не знаю как назвать по-другому) с попыткой учесть множество ньюансов?
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39382998
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchодин раз кто-то заикался, что давайте сделаем отдельный тейблспейс для индексов, типо при ресторе и даже при бекапе можно будет его скипнуть.

Overkill ©SY

За саму идею ребилда индексов при ресторе надо было сразу по рукам давать.
Индексы зачастую выносятся в отдельный столкосмос для размещения файлов этого столкосмос на другой дисковой полке / луне. И, иногда, для возможности прогнозировать рост датафайлов по данным.

Экономить на индексах в бакапе при выпячивании X@# (*xdf) своего OEBSа, как-то странновато выглядит.

Механизм проверки хешей предыдущих изменений в системах наката патчей очень неплохо позволяет избежать вынужденного backmerge при накате велосипедистами только имеющихся на руках изменений на некую старую версию о которой известен только номер.


з.ы. использовал liquibase на проекте с кучей зависимостей, изменением структуры и датафиксами. Проблем при накате с древней версии на свежую было минимум. В основном, не связанных с liquibase как таковым.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39383058
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envЭкономить на индексах в бакапе при выпячивании X@# (*xdf) своего OEBSа, как-то странновато выглядит.
нет никакого OEBS, я его привел как пример грамотно реализованной системы патчей (и генерации и деплоя).

envМеханизм проверки хешей предыдущих изменений в системах наката патчей очень неплохо позволяет избежать вынужденного backmerge при накате велосипедистами только имеющихся на руках изменений на некую старую версию о которой известен только номер.
Про каких велосепедистов ты говоришь? О своем, о наболевшем?

и да, ты походу путаешь backmerge и rollback. backmerge - это когда некая фича или багфикс, реализованная в версии 3.2 срочным порядком добавляется в предыдущую версию, к примеру, 2.9, с учетом того, что между ними полгода-год изменений и много рефакторингов уже прошло.

разрешение конфликтов, 3-way merge, и прочий подобный .... гарантирован.

a rollback это банальный откат на предыдующую версию.

envз.ы. использовал liquibase на проекте с кучей зависимостей, изменением структуры и датафиксами. Проблем при накате с древней версии на свежую было минимум. В основном, не связанных с liquibase как таковым.
никто и не утверждает, что liquibase создает проблемы при деплое. если говорить с позиции наиболее обобщенного решения - то для деплоя лучше и не придумаешь.

у него проблемы с merge/blame/backmerge - собственно работе с системой контроля версий исходных кодов.
он с любой VCS просто идеологически несовместим, ибо перпендикулярен ей, реализуя собственное понимание версий исходного кода: вместо package.sql ревизий 1, 322, 2251 он предлагает иметь sql000001.sql, sql000322.sql и sql002251.sql - и никакой тебе
черепашки, прыгай сам по этим файлам как хочешь, пытаясь выяснить, кто, почему и когда изменил/внес вот эту строку.

неужели это не очевидно?
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39383060
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadНу и зачем такой недовелосипед (не знаю как назвать по-другому) с попыткой учесть множество ньюансов?

понятное дело, чтоб вносить сумятицу и непонимание всякие в умы читателей по диагонали, зачем-же еще?
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39383075
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchон с любой VCS просто идеологически несовместим, ибо перпендикулярен ей, реализуя собственное понимание версий исходного кода: вместо package.sql ревизий 1, 322, 2251 он предлагает иметь sql000001.sql, sql000322.sql и sql002251.sql - и никакой тебе
черепашки, прыгай сам по этим файлам как хочешь, пытаясь выяснить, кто, почему и когда изменил/внес вот эту строку.

неужели это не очевидно?Ты не прав. Кто внушил тебе такой бред?
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39383079
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchAmKadНу и зачем такой недовелосипед (не знаю как назвать по-другому) с попыткой учесть множество ньюансов?понятное дело, чтоб вносить сумятицу и непонимание всякие в умы читателей по диагонали, зачем-же еще?На практике так ведь и получается.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39383101
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKaddbpatchон с любой VCS просто идеологически несовместим, ибо перпендикулярен ей, реализуя собственное понимание версий исходного кода: вместо package.sql ревизий 1, 322, 2251 он предлагает иметь sql000001.sql, sql000322.sql и sql002251.sql - и никакой тебе
черепашки, прыгай сам по этим файлам как хочешь, пытаясь выяснить, кто, почему и когда изменил/внес вот эту строку.

неужели это не очевидно?Ты не прав. Кто внушил тебе такой бред?

ну и в чем именно я не прав? попробуй развернуть свою ээээ.... мысль, а то все телепаты ушли в отпуск, и догадаться что ты там подразумеваешь в виде отличий "такой бред" от "не такой бред", "бред, но не такой" никак не есть возможно.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39383105
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchну и в чем именно я не прав? попробуй развернуть свою ээээ.... мысль, а то все телепаты ушли в отпуск, и догадаться что ты там подразумеваешь в виде отличий "такой бред" от "не такой бред", "бред, но не такой" никак не есть возможно.Ты говоришь, что liquibase несовместим с VCS и вместо package.sql ревизий 1, 322, 2251 он предлагает иметь sql000001.sql, sql000322.sql и sql002251.sql. Я говорю тебе, что ты не прав. Какие тут еще нужны пояснения?
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39383108
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKaddbpatchну и в чем именно я не прав? попробуй развернуть свою ээээ.... мысль, а то все телепаты ушли в отпуск, и догадаться что ты там подразумеваешь в виде отличий "такой бред" от "не такой бред", "бред, но не такой" никак не есть возможно.Ты говоришь, что liquibase несовместим с VCS и вместо package.sql ревизий 1, 322, 2251 он предлагает иметь sql000001.sql, sql000322.sql и sql002251.sql. Я говорю тебе, что ты не прав. Какие тут еще нужны пояснения?

в чем именно я не прав?

как именно он предлагает хранить версии пакетов, просветишь нас тут всех, нет? с ссылкой на документацию оного, мне аж интересно стало.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39383116
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchкак именно он предлагает хранить версии пакетов, просветишь нас тут всех, нет? с ссылкой на документацию оного, мне аж интересно стало.Давай сначала определимся, какой сценарий использования версий пакетов мы обсуждаем:
1) История версий нужна для отслеживания изменений (функционал VCS, например для просмотра diff).
2) В процессе наката требуется скомпилить и запустить несколько разных версий одного пакета.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39383122
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну или могу сформулировать вопрос по-другому: в рассаматриваемом кейсе тебе реально нужно компилить и запускать несколько версий одного пакета, либо достаточно работать с последней версией пакета, но иметь историю его изменений в VCS?
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39383129
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKaddbpatchкак именно он предлагает хранить версии пакетов, просветишь нас тут всех, нет? с ссылкой на документацию оного, мне аж интересно стало.Давай сначала определимся, какой сценарий использования версий пакетов мы обсуждаем:
1) История версий нужна для отслеживания изменений (функционал VCS, например для просмотра diff).
2) В процессе наката требуется скомпилить и запустить несколько разных версий одного пакета.

даже не пытайся подвести меня под AlwaysRun и хранить пакет всегда в одном файле.
это в принципе нарушает концепцию ChangeSet, подобное откровение откровенно не интересно, по той простой причине, что я не хочу каждый раз накатывать over 9000 пакетов.


я прекрасно понимаю, что ты не осилил ни документацию и концепции liquebase, ни книгу Прамодкумара, и твои попытки сохранить лицо ничего, кроме улыбки, сейчас не вызывают.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39383179
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchдаже не пытайся подвести меня под AlwaysRun и хранить пакет всегда в одном файле.Ну вот, а делал вид, что не понимаешь.

dbpatchчто я не хочу каждый раз накатывать over 9000 пакетовТолько сейчас все еще делаешь вид, как будто не знаешь про свойство runOnChange.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39383195
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKaddbpatchдаже не пытайся подвести меня под AlwaysRun и хранить пакет всегда в одном файле.Ну вот, а делал вид, что не понимаешь.

Цитирую еще раз:

я прекрасно понимаю, что ты не осилил ни документацию и концепции liquebase, ни книгу Прамодкумара

уже в третий раз. ну ок, ты молодец, купил BMW X5 и возишь в нем картошку, и думаешь, что это круто. хвалю. на этом закончим?

AmKaddbpatchчто я не хочу каждый раз накатывать over 9000 пакетовТолько сейчас все еще делаешь вид, как будто не знаешь про свойство runOnChange.

в общем случае оно не совместимо с понятием миграций данных (каждая миграция может требовать свою версию пакета и их зависимостей), и опять и снова - с концепией ChangeSet.
мы что, играем в infinite loop? это все уже обсуждалось на предыдущей странице.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39383205
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchliquebaseСпециально коверкаешь?

dbpatchна этом закончим?Да, пожалуй хватит.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39384593
Rudyshin Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И все таки, liqubase и подобные тулы от лукавого
Хотя и должен признать, что _иногда_ удобно пропускать выполненные скрипты, но только нужно иметь в виду, что
Эти тулы не имеют смысла для боевой базы.
Их можно применять для тестовых сред, но нужно быть готовым восстановиться из бэкапа в случае ошибок в changeset'е. И что мешает в таком случае наладить удобное восстановление базы из бэкапа и накатывать весь дистрибутив? Тем более, что установка полноценного дистрибутива, это тест максимально приближенный к установке на боевую базу.
Тулы не предназначены для работы с хранимым кодом. И в случае вызовов этого кода из changeset'ов появляется куча возможностей выстрелить себе в ногу.
С этими тулами вы естественно лишаетесь sqlplus со всеми его плюшками.

> 1) Данный патч не имеет возможности "повторного наката".

только при условии, что патч не идемпотентный
но и в случае liqubase, если внутри changeset-а возникла ошибка, то его поворотно уже не накатишь

пример со стартовой страницы http://www.liquibase.org/index.html

Код: html
1.
2.
3.
--changeset nvoxland:3
create table state AS SELECT DISTINCT state AS id FROM person WHERE state IS NOT NULL;
alter table state modify id char(2) NOT NULL;



Если во время выполнения второго statment'а возникнет ошибка, то changeset становится невалидным.

А хранить каждый statment в отдельном changeset-е очень неудобно.

> 3) Если после наката патча кто-то шаловливыми ручками поправит "неповторяемый" changeset, то ...

Приведу более реальный пример.
На этапе разработки в changeset'е выполнили "drop table a;".
На этапе тестирвания поняли, что это была ошибка.
И естественно меняют "неизменяемый" changeset.

> 4) В liquibase я могу единожды выполнить настройку, которая будет запускать при каждом накате на dev и test-контурах unit-тесты, и игнорировать их запуск на проде

тоже самое можно сделать в sqlplus

> И обязать всех вместо "create or replace" писать либо "create", либо "replace"

согласен, что процедуры и подобные объекты, можно делать в виде идемпотентных скриптов, но только при условии, что каждый храниться в "нормальном" файле
и конфликты мерджа решаются через СКВ
если же помещать идемпотентные скрипты, в changeset'ы, то можно потерять изменения
пример, в котором процедура из JIRA-002 будет перетерта версией из JIRA-001

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
JIRA-001.sql
create or replace function a return number is begin return 1; end;

JIRA-002.sql
create or replace function a return number is begin return 2; end;

patch.sql
@JIRA-002.sql
@JIRA-001.sql
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39384700
Rudyshin Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выше 20091159 привел пример с Иваном и Петром
и хочу ответить какие у них есть проблемы

1) проблема с файлом patch.sql
этот файл есть на обеих ветках
с большой вероятностью при слиянии будут конфликты
причем конфликты ненужные, не отлавливающие реальных проблем
в примере Иван и Петр изменили первую строку и соответственно будет конфликт, хотя им не важно чей патч применится первым
а если предположить, что на проекте сотня файлов и десяток разработчиков, то становится совсем плохо

2) могла бы быть проблема с потерей изменений
например
JIRA-002.sql изменил состав столбцов индекса I1
JIRA-001.sql изменил уникальность I1
после выполнения patch.sql изменения JIRA-002.sql потеряны

3) недоступна история изменений таблиц, индексов и т.п.

чтобы решить проблему 1) нужно генерировать patch.sql автоматически
для этого нужно знать порядок, в котором применить файлы,
а этого можно добиться, указав внутри файлов зависимости от других файлов

чтобы решить проблему 2) необходимо поддерживать два вида патчей
первый - обычный, который переводит из версии N в версию N+1
второй - "полный", который делает установку с "нуля", т.е из 0 в N+1,
и в котором есть только команды типа create, insert, grant
(либо исключения должны быть обоснованы, типа "create or replace functon".
Хотя если написать "create &REPLACE. functon" и устанавливать эту переменную перед деплоем,
то даже это ограничение можно снять )
и нет команд drop, alter, rename, revoke, delete, update и т.п.
в таком случае после слияния веток, БД сообщит об ошибке при попытке создать вторую версию I1
или же во время слияния возникнет конфликт (если правильно организовать хранение объектов в файлах)

Чтобы это заработало, нужно организовать автоматический накат и сравнение баз в обоих режимах
(естественно на неком вспомогательном сервере, например на CI)

Чтобы решить проблему 3) достаточно каждый объект создавать одним DDL и разумно организовать разбиение по файлам.
Например, создание таблицы - отдельный файл, констрейнты - отдельный файл, индексы - отдельный файл.
Такое разбиение, помимо истории изменений, дает возможность повторного использования кода.
Например, в релизе меняется тип секционирования таблицы.
Можно сделать патч вида

JIRA-001.sql:
Код: sql
1.
2.
3.
4.
5.
6.
alter table a rename a_tmp;
@a.tab -- создается таблица и файл a.tab уже изменен и там новый тип секционирования
insert into a select * from a_tmp;
drop table a_tmp;
@a.idx -- создаются индексы
@a.ck -- создаются ограничения



в случае же оформления через changeset'ы, пришлось бы продублировать все команды по созданию таблицы, индексов и т.п.
Не говоря про то, что если кто-то на соседнем бранче добавил новую колонку, то c changeset'ами возникнут проблемы.

учитывая, что на мой взгляд эти проблемы не решаются существующим тулами, то
сделал скрипт (150 строк на bash), который позволяет формировать патчи в двух форматах с учетом зависимостей между скриптами
https://github.com/SergeyRudyshin/gtbuild

сделал шаблон для использования этого скрипта в применении к бд Оракл
https://github.com/SergeyRudyshin/gtbuild_ora_template

и сделал пример, в котором можно в виртуальной машине посмотреть как оно все вместе работает в бд Оракл
https://github.com/SergeyRudyshin/gtbuild_ora_walkthrough

если кого-то заинтересует, буду рад ответить на вопросы
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39384801
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rudyshin Sergeyсогласен, что процедуры и подобные объекты, можно делать в виде идемпотентных скриптов, но только при условии, что каждый храниться в "нормальном" файле
и конфликты мерджа решаются через СКВ
если же помещать идемпотентные скрипты, в changeset'ы, то можно потерять изменения
пример, в котором процедура из JIRA-002 будет перетерта версией из JIRA-001

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
JIRA-001.sql
create or replace function a return number is begin return 1; end;

JIRA-002.sql
create or replace function a return number is begin return 2; end;

patch.sql
@JIRA-002.sql
@JIRA-001.sql

Камрад, ну не хочешь понять ты как работать с liquibase. Сhangeset-ы умеют дружить с файлами. Сhangeset - это логический объект, а файл - физический. У меня весь хранимый код хранится по файлам - отдельный .sql-файл для каждого объекта (исключения пакеты: там один файл на спеку, второй - на тело), да и вообще для каждого типа объектов - свой каталог. Это что касается физики хранения. А теперь на каждый из этих файлов натравлено по changeset-у (с выставленным либо runAlways или runOnChange). То есть при накате changeset выполняет (pl/)sql-код из файла, на который ссылается. Это что касается логики вызова.

При необходимости изменить код какого-либо объекта меняется содержимое соответствующего файла (а не добавляются новые). Это значит, что не будет описанного тобой сценария с перезатиранием объекта, а всю историю изменений объекта ты всегда можешь увидеть по СКВ.

Если же при накате тебе нужно управлять несколькими версиями объекта (пишу об этом уже N-ый раз), то тут нужно будет создать несколько файлов (и желательно для каждого отдельный changeset) - для каждой необходимой версии. Ну и описать логику управления этими версиями - а эта задача возникает вне зависимости того, каким средством ты накатываешь.

Rudyshin Sergey2) могла бы быть проблема с потерей изменений
например
JIRA-002.sql изменил состав столбцов индекса I1
JIRA-001.sql изменил уникальность I1
после выполнения patch.sql изменения JIRA-002.sql потеряныЭта проблема вне контекста выбора системы патчей. На наших проектах мы всегда выбираем ответственного за модель данных и все изменения ее структуры идут через него. А также стараемся избегать ситуаций, когда двое и более разработчиков одновременно работают над одним и тем же объектом.
Все остальные аргументы про слияние веток игнорирую - они вне контекста выбора системы патчей.

Rudyshin Sergeyв случае же оформления через changeset'ы, пришлось бы продублировать все команды по созданию таблицы, индексов и т.п.Повторяю, changeset - логический объект, файл - физический. Связь можно выстраивать любую. Скрипт генерации таблицы (или даже всей схемы целиком) можно бить на .sql-файлы как угодно. И конечно же можно вызывать один и тот же .sql-файл в разных changeset-ах.
Нет такой проблемы, все дело в непонимании принципа работы liquibase.

Rudyshin Sergeyучитывая, что на мой взгляд эти проблемы не решаются существующим тулами, то
сделал скрипт (150 строк на bash), который позволяет формировать патчи в двух форматах с учетом зависимостей между скриптами
https://github.com/SergeyRudyshin/gtbuild

сделал шаблон для использования этого скрипта в применении к бд Оракл
https://github.com/SergeyRudyshin/gtbuild_ora_template

и сделал пример, в котором можно в виртуальной машине посмотреть как оно все вместе работает в бд Оракл
https://github.com/SergeyRudyshin/gtbuild_ora_walkthrough

если кого-то заинтересует, буду рад ответить на вопросыИзвини, но мне это пока неинтересно. Ты и liquibase забраковал, до конца с ним не разобравшись, а полез изобретать собственный велосипед.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39384867
AmKadИзвини, но мне это пока неинтересно. Ты и liquibase забраковал, до конца с ним не разобравшись, а полез изобретать собственный велосипед.

а с чего ты решил(а) что тебя кто-то собрался заинтересовывать?
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39384871
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спросим девчушкуAmKadИзвини, но мне это пока неинтересно. Ты и liquibase забраковал, до конца с ним не разобравшись, а полез изобретать собственный велосипед.а с чего ты решил(а) что тебя кто-то собрался заинтересовывать?Можешь выкинуть первое предложение, основной посыл - во втором.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39385133
Rudyshin Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> все дело в непонимании принципа работы liquibase

скорее в непонимании, зачем для того, чтобы иметь таблицу DATABASECHANGELOG, тянуть в свой проект зависимость в 100 тыс строк!

Код: powershell
1.
2.
$ find liquibase-master/liquibase-core/src/main/ -type f | xargs cat | grep -cv '^ *$'
104122

из всех "фич", которые декларируется, возможно Diff был бы интересен http://www.liquibase.org/documentation/diff.html
но на странице есть оговорка
Код: html
1.
2.
3.
4.
5.
6.
It does not (currently) check

Non-foreign key constraints (check, etc)
Stored Procedures
Data type length
Liquibase can diff different database types, but the results may be skewed due to differences in case and data types
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39385150
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rudyshin Sergeyскорее в непонимании, зачем для того, чтобы иметь таблицу DATABASECHANGELOG, тянуть в свой проект зависимость в 100 тыс строк!Управление таблицей DATABASECHANGELOG - это все, что ты смог найти?
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39385260
AmKadспросим девчушкупропущено...
а с чего ты решил(а) что тебя кто-то собрался заинтересовывать? Можешь выкинуть первое предложение, основной посыл - во втором.

Ты постарайся не говорить, что (можно) делать другим, и глядишь - другие перестанут тебе говорить, куда тебе прям сейчас стоит пройти (с)

:)
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39385643
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rudyshin Sergey> все дело в непонимании принципа работы liquibase

скорее в непонимании, зачем для того, чтобы иметь таблицу DATABASECHANGELOG, тянуть в свой проект зависимость в 100 тыс строк!


Отбрасывая в сторону вопрос пагубности/православности концепции миграций ActiveRecord в Java (и практически полного отсуствия штатной реализации оной в известных ORM) - есть ли пример чего-то более продвинутого в части API встроенных рефакторингов ?

И да, зачем в проект тянуть исходник? Что мешает просто линковать готовый .jar? Если бы Oracle RDBMS EE поставлялась в open-source, вы бы ее тоже каждый раз пересобирали?
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39388753
Rudyshin Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> есть ли пример чего-то более продвинутого в части API встроенных рефакторингов ?

А какие есть примеры не продвинутых встроенных рефакторингов? Не совсем понимаю о чем речь.

> И да, зачем в проект тянуть исходник?

мой комментарий был о сложности проекта. Естественно, можно и нужно использовать готовый jar.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39388793
Rudyshin Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> единственно правильным является Oracle XDF/ODF фреймфорк

почитал документацию
https://docs.oracle.com/cd/E26401_01/doc.122/e22961/T302934T609784.htm

и насколько понял, XDF это XML файл, в котором сохраняются метаданные главного объекта и его зависимостей.
Есть утилита XDFGEN, которая генерирует эти файлы.
И есть xdfcmp, которая умеет сравнивать XDF файлы с базой и "накатывать" их.

Если мое понимание верно и подход заключается в том, чтобы оперировать XML файлами полученными автоматически, а именно хранить их в системе контроля версий и передавать эти файлы для установки и т.д.
то на мой взгляд, это как минимум неудобно

Правильным, как раз скорее является подход, которого Оракл придерживается с начала времен, и я сильно сомневаюсь, что они используют XDF или Liquibase
как пример смотрю на файл
@?/rdbms/admin/catalog.sql
и его зависимости
По истории изменений видно, что файл был создан почти 30 лет назад и до сих пор меняется
Код: html
1.
2.
3.
Rem     talliu     10/02/13  - call catblock.sql
...
Rem   Grayson    03/21/88 - Creation


если смотреть на сами скрипты, то видно, что они меняются вручную, а не генерируются (по крайней мере с первого взгляда).
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39388953
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rudyshin SergeyПравильным, как раз скорее является подход, которого Оракл придерживается с начала времен, и я сильно сомневаюсь, что они используют XDF или Liquibase
как пример смотрю на файл
@?/rdbms/admin/catalog.sql
и его зависимости
По истории изменений видно, что файл был создан почти 30 лет назад и до сих пор меняется
Код: html
1.
2.
3.
Rem     talliu     10/02/13  - call catblock.sql
...
Rem   Grayson    03/21/88 - Creation


если смотреть на сами скрипты, то видно, что они меняются вручную, а не генерируются (по крайней мере с первого взгляда).И у оракла бывают проблемы. На днях ставил Oracle 11.2 XE на свою виндовую локальную тачку. По завершению инсталлер говорит что все ОК - а на деле базы-то и нет. Решал по аналогии 14769174 . Я уж не говорю про проблемы при обращении к v$-вьюхам, например к v$session.
...
Рейтинг: 0 / 0
СУБД. История изменений
    #39388968
Rudyshin Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> И у оракла бывают проблемы

и не мало. Например, одна из тех, с которыми приходилось сталкиваться: catalog.sql отрабатывает с ошибкой если переменная SQLBLANKLINES установлена в ON.

> На днях ставил Oracle 11.2 XE на свою виндовую локальную тачку. По завершению инсталлер говорит что все ОК - а на деле базы-то и нет. Решал по аналогии 14769174

Возможно это действительно так. Но никогда нет полной уверенности, пока установка делается вручную.
Некоторое время назад познакомился с утилитой https://www.packer.io, которая нарезает образы для VM из дистрибутивов.
вот тут https://github.com/boxcutter/windows можно найти конфигурации, которые создают образы Windows.

Нам бы в FAQ добавить что-то подобное, чтобы запустив одну команду создавался бы образ VM с установленным Ораклом под винду...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
СУБД. История изменений
    #39913665
karbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.

А есть ли у кого опыт использования Flyway в продакшн для версионирования БД? Поделитесь, плиз.
...
Рейтинг: 0 / 0
71 сообщений из 71, показаны все 3 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / СУБД. История изменений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]