Изменение computed-поля в таблице

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Boris Kuritsin
Сообщения: 11
Зарегистрирован: 24 фев 2005, 13:10

Изменение computed-поля в таблице

Сообщение Boris Kuritsin » 11 окт 2005, 17:33

Есть вычисляемое поле в таблице (numeric(18, 2)). От него зависят еще 2 вычисляемых поля в этой таблице и несколько процедур.

Проблема в следующем: надо немного изменить формулу вычисления поля. Это изменение не повлечет изменения типа поля.

Как это сделать?

Удалить поле - значит удалить 2 зависящих от него поля. Но от них всех троих в сумме зависит более десятка процедур! Как это можно обойти?

Заранее благодарю.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 11 окт 2005, 17:43

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

Boris Kuritsin
Сообщения: 11
Зарегистрирован: 24 фев 2005, 13:10

Сообщение Boris Kuritsin » 11 окт 2005, 18:00

Давай попробуем. Бэкап есть :)

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 11 окт 2005, 18:40

0. Шатдауним базу, разгоняем всех усеров, коннектимся сысдбой, обеспечиваем организационно чтоб ещё один сысдба или овнер в ней не болтался.
1. Создаём новое поле с нужной формулой.
2. Коммит.
3. Апдейтим rdb$computed_source и rdb$computed_blr в rdb$fields из нового поля в нужное.
4. Коммит.
5. Дропаем новое поле за ненадобностью.
6. Коммит.
7. Проверяем что получилось селектом.
8. Онлайним базу и запускаем усеров.

Boris Kuritsin
Сообщения: 11
Зарегистрирован: 24 фев 2005, 13:10

Сообщение Boris Kuritsin » 17 окт 2005, 17:37

Merlin писал(а):0. Шатдауним базу, разгоняем всех усеров, коннектимся сысдбой, обеспечиваем организационно чтоб ещё один сысдба или овнер в ней не болтался.
1. Создаём новое поле с нужной формулой.
2. Коммит.
3. Апдейтим rdb$computed_source и rdb$computed_blr в rdb$fields из нового поля в нужное.
4. Коммит.
5. Дропаем новое поле за ненадобностью.
6. Коммит.
7. Проверяем что получилось селектом.
8. Онлайним базу и запускаем усеров.
Спасибо большое, все получилось!

Akella
Сообщения: 95
Зарегистрирован: 13 дек 2005, 12:07

Сообщение Akella » 03 апр 2006, 16:01

у меня сейчас установлен сервер FB 2.0 rc1
нет там rdb$computed_source

открываю IBExpert:
SELECT * FROM rdb$computed_source

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Table unknown.
RDB$COMPUTED_SOURCE.
At line 1, column 15.

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 апр 2006, 16:13

с таким подходом и ничего подсказывать не хочется, ибо убъешь ты базу нафиг, и все. таблицы rdb$computed_source никогда не было, и нету. В какой таблице - тебе сказали (см. выше).

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 03 апр 2006, 16:20

1. Доку читать влом в пинципе.
2. Релиз ноты вообще читают только старые идиоты, 10 и больше лет живущие на всех версиях по очереди.
3. Даже в форуме строки в сообщениях и то до конца дочитывать лень.

А иди-ка ты, добрый человек, учиться читать, а то я щас так посоветую, что клочков базы не найдёшь попробовавши.

Akella
Сообщения: 95
Зарегистрирован: 13 дек 2005, 12:07

Сообщение Akella » 03 апр 2006, 16:32

Да увидел, невнимательный бываю :oops:

Akella
Сообщения: 95
Зарегистрирован: 13 дек 2005, 12:07

Сообщение Akella » 03 апр 2006, 16:50

1. Доку читать не влом, поверьте, только я на английском не очень.
2. И релизноты тоже ковыряю, с трудом, правда
3. Не лень, а невнимательно прочитал и все.

И не нужно так злиться,
Зачем Вы вообще отвечаете таким образом. Я не пойму, что у вас админы такие злые на форуме? Если Вы призваны помогать нам, пользователям, то помогайте. Если помогать не хотите, то и не ругайтесь. А то статьи написали и будь здоров, да? Пошли все вон туда.... А нам, мол некогда. А форум-то не может жить на "трёх" темах, чтобы прользователи "ходили" на ваш форум, нужно отношение другое. А Вам, чувствую, нужно в отпуск съездить. Не злитель, пожалуста. Мы(пользователи) уважаем вас(админов, модерторов). :roll: Давайте жить дружно.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 апр 2006, 18:13

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

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

Так что, если ты и есть "Борис", задавший исходный вопрос, то я бы лучше посоветовал не тратить время, и сделать все обычным способом - закомментировать процедуры, поменять вычисляемое поле, вернуть процедуры обратно, помедитировать на тему, а может сделать "вычисляемое поле" по другому, если в будущем придется еще раз такую же операцию проводить.
Ведь грохнуть процедуры и зависимости - можно очень быстро. Экспортируешь процедуры в скрипт, сохраняешь, удаляешь в базе. Меняешь таблицы, создаешь процедуры из скрипта. Куда безопаснее, чем колупать содержимое системных таблиц с непредсказуемым результатом. Да еще с учетом того, что модификация системных таблиц - это неявный DDL, то есть тут надо аккуратно commit делать, а в некоторых моментах еще и переподсоединиться на всякий случай.

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

Akella
Сообщения: 95
Зарегистрирован: 13 дек 2005, 12:07

Сообщение Akella » 04 апр 2006, 09:15

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

И я не Борис, я Сергей. Нет это не я создал тему.

Код: Выделить всё

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

Slava Ekimov
Сообщения: 44
Зарегистрирован: 26 окт 2004, 14:30

Сообщение Slava Ekimov » 04 апр 2006, 13:32

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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 04 апр 2006, 13:38

С хаками всегда надо поаккуратней. Я уж подумывал грохнуть тот пост, да его уже процитировали целиком. Я ими и сам очень редко пользуюсь. Этим, с компутедными полями - только в случае неизменности типа. Просто когда в базе тысячи процедур, то всеобщая перекомпиляция - тоже дело небыстрое и сопряжена с некоторым риском - а ну как где завалится на полдороге, распутывайся потом. И зависимости отслеживать бывает вломно. Но аккуратненько и перекрестясь :)

Ответить