|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
В таблицах определены поля VARCHAR(N); Уже после написания логики (вьюх, правил, триггеров...) появилась необходимость в изменении размерности поля. Сделать ...ALTER COLUMN... TYPE... на поле, участвующее во вьюхах, PostgreSQL НЕ ПОЗВОЛЯЕТ !!! --- ERROR: cannot alter type of a column used by a view or rule DETAIL: правило _RETURN напредставление v_vip_spec зависит от колонки "kontra_bank_schet" --- А таких зависимостей уже очень много... Как правильно справиться с этой проблемой ? Документация лопатилась. Поиски в Inet-е тоже ничего не дали. В других БД размерность меняется "на лету". ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2006, 13:13 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
Собрат по несчастью :о) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2006, 13:40 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
Только если сделать дамп базы в sql формат, поменять там тип поля и создать базу заново. Вариант попроще: удалить конфликтующую view и всё зависимое от неё. Сделать alter table, а затем создать view и прочее заново. Насколько я знаю, других вариантов нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2006, 13:42 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
2 Pamir Вот-вот, подобный случай был в Тамбове... 2 Andrew Sagulin Эти варианты конечно же рассматривались, но view-х, связанных с банковским счетом (в данном случае) накопилось уже слишком много, а через дамп с изменением в структуре - крайняк, вариант очень неудобный. Несуразна сама проблема. Если проект уже набрал ход (с круглосуточной работой и т.д.), то такая "мелочь" ставит крест на on-line режиме. Может кто-то знает недокументированные тонкости, позволяющие разрешить это "на лету" ? За ответы - спасибо. Правильно поставленный вопрос может стоять очень долго. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2006, 14:35 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
Попробую поставить вопрос по-другому. Может есть какие-либо внешние утилиты , позволяющие модифицировать поля таблиц PostgreSQL ? Во всяком случае PgAdmin, EMS (ver. 3.1.0.1)... пока этого делать не умеют. PostgreSQL версия 8.0.6 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2006, 15:29 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
opexobЭти варианты конечно же рассматривались, но view-х, связанных с банковским счетом (в данном случае) накопилось уже слишком много, а через дамп с изменением в структуре - крайняк, вариант очень неудобный. Вариант не удобный, но позволит остаться в online: оформляешь все дроп, альтер и креэйт вьюв в одну транзакцию (между begin trransaction и commit transaction :-) - например в файлик - и выполняешь. Пользователи и не заметят, что что-то произошло (если, конечно, не обнаружаться зависимости в клиентских программах :0) И никакая тулза за тебя это не сделает, ибо смена типа поля может привести к полной неработоспособности системы (напр: для бывшего типа была объявлена функция, для нового такой функции нет - ну забыл ты её создать) (или: тулза не может (даже теоретически) проверять функции на процедурных языках - хотя бы потому, что сам Postgres этого не делает - сменил тип и они не работают). Так что придется ручками. А про online не надо - Postgres лучше приготовлен к online чем большинство конкурентов. Просто иногда больше приходиться делать вручную. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 09:56 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
Извини, я конечно же не имел в виду dump. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 09:58 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
Funny_FalconА про online не надо - Postgres лучше приготовлен к online чем большинство конкурентов. Я правильно понимаю, что Оракл и постгрес - не конкуренты? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 11:13 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
Funny_FalconИзвини, я конечно же не имел в виду dump. Спасибо за ответ. Конечно, понятно, что не drop, но "оформляешь все дроп" звучит как-то веселее, жизнерадостнее и оптимистичнее :) :) :) Что касается on-line, так у нас на Postgres биллинг написан. Как часики молотит. За год ни одного слета, даже когда рвалось питание в процессе работы сервака. Но речь идет не о качестве Pg в работе. Что касаемо тулзы, то на самом деле все реально. Сдается, что для разработчиков того же EMS это проблемы не составит. Не отходя от стандартов добавить собственный отдельный режимчик (без генерации внешнего SQL кода). Все связи-каскады там хорошо отслеживаются, что, где лежит и подлежит замене. Но это лишь теоретически. Вряд ли кто-либо будет этим заниматься. БД сама должна разруливать проблему связанных объектов в случае изменения в базовом. Ладно бы char-int... А то ведь не поменяешь даже с varchar(20), на varchar(30) ! Остается надеяться на новые версии. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 11:19 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
Не вижу никакой проблемы, пишете скрипт Код: plaintext 1. 2.
Если бы вы работали с Firebird, то там пришлось бы отключать всех пользователей. Если вьюшек реально много (для меня больше 20), я бы написал процедуру, которая читает системные таблицы и дропает вьюшки. Если изменяемое поле участвует в процедурах, я бы посоветовал их тоже пересоздать. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 11:22 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
Я бы добавил, что не только вьюшки, а еще и хранимки и типы. Еще какие-нибудь объекты могут зависеть от таблицы? PS. А от этих хранимок, вьюх и типов могут зависеть другие хранимки, вьюхи и типы. А от тех - третьи... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 11:31 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
pamirЯ бы добавил, что не только вьюшки, а еще и хранимки и типы. Еще какие-нибудь объекты могут зависеть от таблицы? PS. А от этих хранимок, вьюх и типов могут зависеть другие хранимки, вьюхи и типы. А от тех - третьи... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 13:04 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
pamirЯ бы добавил, что не только вьюшки, а еще и хранимки и типы. Еще какие-нибудь объекты могут зависеть от таблицы? PS. А от этих хранимок, вьюх и типов могут зависеть другие хранимки, вьюхи и типы. А от тех - третьи... Pamir, вот про это как-то забывают. Когда одних вьюх, к примеру, более сотни... Не говоря уже о том, что одновременно разные блоки пишут несколько программистов. Похоже радикальных предложений больше не поступит и когда сей вопрос всплывет очередной раз, я как и ты напишу: собрат по несчастью :-( со ссылкой на эту ветку :-) Спасибо откликнувшимся. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 13:09 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
.gc pamirЯ бы добавил, что не только вьюшки, а еще и хранимки и типы. Еще какие-нибудь объекты могут зависеть от таблицы? PS. А от этих хранимок, вьюх и типов могут зависеть другие хранимки, вьюхи и типы. А от тех - третьи... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Ээээ... Красивая картинка... И что? А теперь попробуем поменять в таблице t01 тип a_data На более длинный... Придется в данном прмере рушить ВСЕ вьюхи, и хранимки (здесь их не много, но в большом проекте, типа биллинга, зависимости могут быть очень интересные). Или Вы как раз для этого и привели пример? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 13:12 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
pamir Ээээ... Красивая картинка... И что? А теперь попробуем поменять в таблице t01 тип a_data На более длинный... Придется в данном прмере рушить ВСЕ вьюхи, и хранимки (здесь их не много, но в большом проекте, типа биллинга, зависимости могут быть очень интересные). Или Вы как раз для этого и привели пример? эт был простой пример. картинка сгенерирована автоматически по зависимостям из базы ( pg_show_deps ) , т.е. в принципе, отследить что еще потребуется менять при ALTER COLUMN -- возможно, но такая функциональность все еще в PostgreSQL TODO [Allow VIEW/RULE recompilation when the underlying tables change], а в каких-то прогах я пока не встречал :( ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 13:30 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
Если все так серьезно, значит вам уже пора переходить от "плавно-накатного" к более "релизному" стилю работы. т.е. копить все изменения, а потом останавливать и разом обновлять систему до следующего релиза. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 13:33 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
2 Pamir Это просто "реальность в ощущение" для наглядности. Я думал, что есть какая-то "фишка" :) Запустил код, попробовал изменить... :) - фишки нет ! Получается просто 5-ти строчный пример с наглядным примером зависимостей. Т.е. "ребята, пробуйте..." ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 13:39 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
opexob2 Pamir Это просто "реальность в ощущение" для наглядности. Я думал, что есть какая-то "фишка" :) Запустил код, попробовал изменить... :) - фишки нет ! Получается просто 5-ти строчный пример с наглядным примером зависимостей. Т.е. "ребята, пробуйте..." У меня одно предложение - написать тулзу, в которую вводишь, какой объект будешь модифицировать, а он выводит тебе скрипт по зависимостям из БД - на дроп и на создание зависимых объектов. А в серединку нужно будет запихать ту самую модификацию. Потом скрипт смотрится глазами, на всякий случай, и пускается. Сначала на тестовой, и потом на боевой базе. Да, предложение не в смысле, что я буду его писать :о) А в смысле - идея технического решения. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 13:44 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
pamirУ меня одно предложение - написать тулзу, в которую вводишь, какой объект будешь модифицировать, а он выводит тебе скрипт по зависимостям из БД - на дроп и на создание зависимых объектов. А в серединку нужно будет запихать ту самую модификацию. Потом скрипт смотрится глазами, на всякий случай, и пускается. Сначала на тестовой, и потом на боевой базе. Да, предложение не в смысле, что я буду его писать :о) А в смысле - идея технического решения. Pamir, это все-равно не выход. В конце концов все сводится к экспорту DDL+данные (в ключевом месте), drop, create... зависимых объектов. Короче - автоматизация той же ручной схемы. Хоть зависимые объекты, как правило, изменений в структуре и не требуют, но для реального проекта с большим объемом данных это - "не есть хорошо". Можно вообще использовать динамические вьюхи, пряча их код в клиентской части (Delphi, PHP, Java...), тогда и зависимостей нет и меняй что хочешь, но усложняется написание логики (к динамической вьюхе не обратишься, в другом месте придется ее дублировать, к примеру, с некоторыми незначительными изменениями и т.д.). Проект разбухает, теряет прозрачность... и... "кранты" такому проекту :( ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 14:34 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
pamir У меня одно предложение - написать тулзу, в которую вводишь, какой объект будешь модифицировать, а он выводит тебе скрипт по зависимостям из БД - на дроп и на создание зависимых объектов. А в серединку нужно будет запихать ту самую модификацию. т.е. что-то типа такого? (для вышеприведенного примера) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 15:17 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
.gc pamir У меня одно предложение - написать тулзу, в которую вводишь, какой объект будешь модифицировать, а он выводит тебе скрипт по зависимостям из БД - на дроп и на создание зависимых объектов. А в серединку нужно будет запихать ту самую модификацию. т.е. что-то типа такого? (для вышеприведенного примера) Да, вы его чем-то генерили? Или руками собрали? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 15:27 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
pamir Да, вы его чем-то генерили? Или руками собрали? генерил - хакнутым на скорую руку скриптом pg_show_deps :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 15:39 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
Итак, пока получается следующее... DDL всех отлаженных вьюх, ХП, триггеров... держать в скрипте №3: -- скрипт №1 ----------- DROP...1 DROP...2 ... DROP...N -- скрипт №2 ----------- ALTER... ... изменения необходимых частей таблиц-объектов -- скрипт №3 ----------- CREATE OR REPLACE...1 CREATE OR REPLACE...2 ... CREATE OR REPLACE...N -------- Последовательный запуск 3-х скриптов в пакете. Тогда проблема только в "генерилке" корректного скрипта №1 (с DROP) и №3 (с DDL-кодом). Ручками замахаешься отслеживать в этих скриптах всякие изменения. Имеется ввиду генерилка для выборочных объектов (только тех, что связаны с изменяемым). Плюс проверить на скорость и корректность исполнения "на лету", а то может не мудрствовать и обновлять всю сотню вьюх, хранимок и т.д. ? Да-а-а, корректная генерилка не помешала бы ! :) :) :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 16:34 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
2 Pamir и gc О проблеме корректной генерилки. Часто важна последовательность создания объектов. Конкретный объект создается на основе ранее созданного(ых)... Т.е. голый экспорт DDL-кода не прокатит (может не прокатить) на этапе генерации объектов. Эти грабли заавтоматизировать трудновато - только программист может разъяснить последовательность и логику создания того-то на основе того-то и последующей увязки того-то с тем-то... Впрочем, если проект без наворотов (вьюха на вьюхе сидит и хранимой подгоняет) логика должна отрабатывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 17:19 |
|
Модификация поля таблицы. Неужели невозможно ?
|
|||
---|---|---|---|
#18+
opexob2 Pamir и gc Эти грабли заавтоматизировать трудновато - только программист может разъяснить последовательность и логику создания того-то на основе того-то и последующей увязки того-то с тем-то... Впрочем, если проект без наворотов (вьюха на вьюхе сидит и хранимой подгоняет) логика должна отрабатывать. Ммм.... а разве, например, тот же pg_dump не выводит сам все в правильной последовательности для востановления? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2006, 21:27 |
|
|
start [/forum/topic.php?fid=53&fpage=23&tid=1994501]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
129ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 252ms |
0 / 0 |