powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / СУБД. История изменений
21 сообщений из 71, страница 3 из 3
СУБД. История изменений
    #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
21 сообщений из 71, страница 3 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / СУБД. История изменений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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