powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Модификация поля таблицы. Неужели невозможно ?
25 сообщений из 33, страница 1 из 2
Модификация поля таблицы. Неужели невозможно ?
    #34063304
opexob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В таблицах определены поля 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-е тоже ничего не дали.

В других БД размерность меняется "на лету".
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34063398
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собрат по несчастью :о)
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34063408
Andrew Sagulin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только если сделать дамп базы в sql формат, поменять там тип поля и создать базу заново. Вариант попроще: удалить конфликтующую view и всё зависимое от неё. Сделать alter table, а затем создать view и прочее заново.
Насколько я знаю, других вариантов нет.
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34063631
opexob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Pamir
Вот-вот, подобный случай был в Тамбове...

2 Andrew Sagulin
Эти варианты конечно же рассматривались, но view-х, связанных с банковским счетом (в данном случае) накопилось уже слишком много, а через дамп с изменением в структуре - крайняк, вариант очень неудобный.

Несуразна сама проблема.
Если проект уже набрал ход (с круглосуточной работой и т.д.), то такая "мелочь" ставит крест на on-line режиме.

Может кто-то знает недокументированные тонкости, позволяющие разрешить это "на лету" ?

За ответы - спасибо.

Правильно поставленный вопрос может стоять очень долго. :)
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34063899
opexob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробую поставить вопрос по-другому.

Может есть какие-либо внешние утилиты , позволяющие модифицировать поля таблиц PostgreSQL ? Во всяком случае PgAdmin, EMS (ver. 3.1.0.1)... пока этого делать не умеют.

PostgreSQL версия 8.0.6
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34065551
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
opexobЭти варианты конечно же рассматривались, но view-х, связанных с банковским счетом (в данном случае) накопилось уже слишком много, а через дамп с изменением в структуре - крайняк, вариант очень неудобный.

Вариант не удобный, но позволит остаться в online:
оформляешь все дроп, альтер и креэйт вьюв в одну транзакцию (между begin trransaction и commit transaction :-) - например в файлик - и выполняешь. Пользователи и не заметят, что что-то произошло (если, конечно, не обнаружаться зависимости в клиентских программах :0)

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

А про online не надо - Postgres лучше приготовлен к online чем большинство конкурентов. Просто иногда больше приходиться делать вручную.
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34065560
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извини, я конечно же не имел в виду dump.
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34065832
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Funny_FalconА про online не надо - Postgres лучше приготовлен к online чем большинство конкурентов.
Я правильно понимаю, что Оракл и постгрес - не конкуренты? :)
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34065859
opexob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Funny_FalconИзвини, я конечно же не имел в виду dump.

Спасибо за ответ.

Конечно, понятно, что не drop, но "оформляешь все дроп" звучит как-то веселее, жизнерадостнее и оптимистичнее :) :) :)
Что касается on-line, так у нас на Postgres биллинг написан. Как часики молотит. За год ни одного слета, даже когда рвалось питание в процессе работы сервака. Но речь идет не о качестве Pg в работе.
Что касаемо тулзы, то на самом деле все реально. Сдается, что для разработчиков того же EMS это проблемы не составит. Не отходя от стандартов добавить собственный отдельный режимчик (без генерации внешнего SQL кода). Все связи-каскады там хорошо отслеживаются, что, где лежит и подлежит замене. Но это лишь теоретически. Вряд ли кто-либо будет этим заниматься. БД сама должна разруливать проблему связанных объектов в случае изменения в базовом. Ладно бы char-int... А то ведь не поменяешь даже с varchar(20), на varchar(30) !

Остается надеяться на новые версии.
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34065871
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не вижу никакой проблемы, пишете скрипт

Код: plaintext
1.
2.
--Удалить вьюшки
--Изменить структуру
--Создать вьюшки
И выполняете его. Никакого прерывания on-line.
Если бы вы работали с Firebird, то там пришлось бы отключать всех пользователей.
Если вьюшек реально много (для меня больше 20), я бы написал процедуру, которая читает системные таблицы и дропает вьюшки. Если изменяемое поле участвует в процедурах, я бы посоветовал их тоже пересоздать.
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34065915
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы добавил, что не только вьюшки, а еще и хранимки и типы. Еще какие-нибудь объекты могут зависеть от таблицы?

PS. А от этих хранимок, вьюх и типов могут зависеть другие хранимки, вьюхи и типы. А от тех - третьи...
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34066327
.gc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.gc
Гость
pamirЯ бы добавил, что не только вьюшки, а еще и хранимки и типы. Еще какие-нибудь объекты могут зависеть от таблицы?

PS. А от этих хранимок, вьюх и типов могут зависеть другие хранимки, вьюхи и типы. А от тех -
третьи...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create table t01 (id serial primary key, a_data varchar( 12 ));
create table t02 (id serial primary key, p_id int, b_data varchar( 100 ));

create view v01 as select * from t01;
create view v02 as select t02.id, a_data, b_data from v01 join t02 on (v01.id = t02.p_id);
create function f01 (_id int) returns setof v02 as $$
 select * from v02 where id = $ 1 ;
$$ LANGUAGE sql;
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34066346
opexob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pamirЯ бы добавил, что не только вьюшки, а еще и хранимки и типы. Еще какие-нибудь объекты могут зависеть от таблицы?

PS. А от этих хранимок, вьюх и типов могут зависеть другие хранимки, вьюхи и типы. А от тех - третьи...

Pamir, вот про это как-то забывают.

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

Похоже радикальных предложений больше не поступит и когда сей вопрос всплывет очередной раз, я как и ты напишу: собрат по несчастью :-( со ссылкой на эту ветку :-)

Спасибо откликнувшимся.
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34066365
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.gc pamirЯ бы добавил, что не только вьюшки, а еще и хранимки и типы. Еще какие-нибудь объекты могут зависеть от таблицы?

PS. А от этих хранимок, вьюх и типов могут зависеть другие хранимки, вьюхи и типы. А от тех -
третьи...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create table t01 (id serial primary key, a_data varchar( 12 ));
create table t02 (id serial primary key, p_id int, b_data varchar( 100 ));

create view v01 as select * from t01;
create view v02 as select t02.id, a_data, b_data from v01 join t02 on (v01.id = t02.p_id);
create function f01 (_id int) returns setof v02 as $$
 select * from v02 where id = $ 1 ;
$$ LANGUAGE sql;

Ээээ... Красивая картинка... И что?
А теперь попробуем поменять в таблице t01 тип a_data На более длинный... Придется в данном прмере рушить ВСЕ вьюхи, и хранимки (здесь их не много, но в большом проекте, типа биллинга, зависимости могут быть очень интересные).
Или Вы как раз для этого и привели пример?
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34066460
.gc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.gc
Гость
pamir
Ээээ... Красивая картинка... И что?
А теперь попробуем поменять в таблице t01 тип a_data На более длинный... Придется в данном прмере рушить ВСЕ вьюхи, и хранимки (здесь их не много, но в большом проекте, типа биллинга, зависимости могут быть очень интересные).
Или Вы как раз для этого и привели пример?
эт был простой пример.
картинка сгенерирована автоматически по зависимостям из базы ( pg_show_deps ) , т.е. в принципе, отследить что еще потребуется менять при ALTER COLUMN -- возможно, но такая функциональность все еще в PostgreSQL TODO [Allow VIEW/RULE recompilation when the underlying tables change], а в каких-то прогах я пока не встречал :(
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34066480
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если все так серьезно, значит вам уже пора переходить от "плавно-накатного" к более "релизному" стилю работы. т.е. копить все изменения, а потом останавливать и разом обновлять систему до следующего релиза.
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34066522
opexob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Pamir
Это просто "реальность в ощущение" для наглядности.
Я думал, что есть какая-то "фишка" :)
Запустил код, попробовал изменить... :) - фишки нет !
Получается просто 5-ти строчный пример с наглядным примером зависимостей. Т.е. "ребята, пробуйте..."
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34066554
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
opexob2 Pamir
Это просто "реальность в ощущение" для наглядности.
Я думал, что есть какая-то "фишка" :)
Запустил код, попробовал изменить... :) - фишки нет !
Получается просто 5-ти строчный пример с наглядным примером зависимостей. Т.е. "ребята, пробуйте..."
У меня одно предложение - написать тулзу, в которую вводишь, какой объект будешь модифицировать, а он выводит тебе скрипт по зависимостям из БД - на дроп и на создание зависимых объектов. А в серединку нужно будет запихать ту самую модификацию.
Потом скрипт смотрится глазами, на всякий случай, и пускается. Сначала на тестовой, и потом на боевой базе.
Да, предложение не в смысле, что я буду его писать :о) А в смысле - идея технического решения.
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34066804
opexob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pamirУ меня одно предложение - написать тулзу, в которую вводишь, какой объект будешь модифицировать, а он выводит тебе скрипт по зависимостям из БД - на дроп и на создание зависимых объектов. А в серединку нужно будет запихать ту самую модификацию.
Потом скрипт смотрится глазами, на всякий случай, и пускается. Сначала на тестовой, и потом на боевой базе.
Да, предложение не в смысле, что я буду его писать :о) А в смысле - идея технического решения.

Pamir, это все-равно не выход. В конце концов все сводится к экспорту DDL+данные (в ключевом месте), drop, create... зависимых объектов. Короче - автоматизация той же ручной схемы. Хоть зависимые объекты, как правило, изменений в структуре и не требуют, но для реального проекта с большим объемом данных это - "не есть хорошо".

Можно вообще использовать динамические вьюхи, пряча их код в клиентской части (Delphi, PHP, Java...), тогда и зависимостей нет и меняй что хочешь, но усложняется написание логики (к динамической вьюхе не обратишься, в другом месте придется ее дублировать, к примеру, с некоторыми незначительными изменениями и т.д.). Проект разбухает, теряет прозрачность... и... "кранты" такому проекту :(
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34067003
.gc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.gc
Гость
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.
pg_what_dep$ ./ddl_depend 'dbname=test_db port=5678' 'TABLE public.t01 COLUMN a_data' 'ALTER TABLE public.t01 ALTER COLUMN a_data TYPE text'
DROP FUNCTION public.f01(integer);
DROP VIEW public.v02;
DROP VIEW public.v01;

---
--- ALTER:
---
ALTER TABLE public.t01 ALTER COLUMN a_data TYPE text
---
---

CREATE VIEW public.v01 AS  SELECT t01.id, t01.a_data
   FROM t01;

-- SKIP VIEW public.v01 COLUMN a_data

-- SKIP VIEW public.v01 COLUMN id

CREATE VIEW public.v02 AS  SELECT t02.id, v01.a_data, t02.b_data
   FROM v01
   JOIN t02 ON v01.id = t02.p_id;

-- SKIP TYPE: COMPOSITE VIEW public.v02

CREATE OR REPLACE FUNCTION public.f01 (_id integer) RETURNS SETOF v02 AS $_$
 select * from v02 where id = $ 1 ;
$_$ LANGUAGE 'sql' ;
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34067061
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.gc pamir
У меня одно предложение - написать тулзу, в которую вводишь, какой объект будешь модифицировать, а он выводит тебе скрипт по зависимостям из БД - на дроп и на создание зависимых объектов. А в серединку нужно будет запихать ту самую модификацию.

т.е. что-то типа такого? (для вышеприведенного примера)

Да, вы его чем-то генерили? Или руками собрали?
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34067132
.gc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.gc
Гость
pamir
Да, вы его чем-то генерили? Или руками собрали?
генерил - хакнутым на скорую руку скриптом pg_show_deps :)
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34067391
opexob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак, пока получается следующее...

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-кодом). Ручками замахаешься отслеживать в этих скриптах всякие изменения. Имеется ввиду генерилка для выборочных объектов (только тех, что связаны с изменяемым). Плюс проверить на скорость и корректность исполнения "на лету", а то может не мудрствовать и обновлять всю сотню вьюх, хранимок и т.д. ?
Да-а-а, корректная генерилка не помешала бы ! :) :) :)
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34067504
opexob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Pamir и gc
О проблеме корректной генерилки.

Часто важна последовательность создания объектов. Конкретный объект создается на основе ранее созданного(ых)... Т.е. голый экспорт DDL-кода не прокатит (может не прокатить) на этапе генерации объектов.

Эти грабли заавтоматизировать трудновато - только программист может разъяснить последовательность и логику создания того-то на основе того-то и последующей увязки того-то с тем-то...
Впрочем, если проект без наворотов (вьюха на вьюхе сидит и хранимой подгоняет) логика должна отрабатывать.
...
Рейтинг: 0 / 0
Модификация поля таблицы. Неужели невозможно ?
    #34068110
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
opexob2 Pamir и gc
Эти грабли заавтоматизировать трудновато - только программист может разъяснить последовательность и логику создания того-то на основе того-то и последующей увязки того-то с тем-то...
Впрочем, если проект без наворотов (вьюха на вьюхе сидит и хранимой подгоняет) логика должна отрабатывать.

Ммм.... а разве, например, тот же pg_dump не выводит сам все в правильной последовательности для востановления?
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Модификация поля таблицы. Неужели невозможно ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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