powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Перекомпиляция ХП и alter column type
14 сообщений из 14, страница 1 из 1
Перекомпиляция ХП и alter column type
    #38831827
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте,

у меня вопрос: вот есть, положим, некоторая ХП, пусть она в процессе работы получает значение из какого-то поля типа X. В один день к этому полю применяется alter table ... alter column ... type Y - удачно, т.е. формат поля меняется. При этом процедура написана так, что менять интерфейс или исходный код процедуры при смене формата поля не нужно.

Прав ли я, полагая, что перекомпилировать процедуру в этом случае не нужно при любых Y?

предыстория
Написал процедуру:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create procedure Test
returns (param varchar(12))
as
begin
  select first 1 fld_char --varchar(10)
  from tbl_drop_table_a
  into :param;
  suspend;
end;


Смотрю BLR в IBExpert, там blr_assignment, который ссылается на поле по имени:
Код: 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.
blr_version5,
blr_begin,
   blr_message, 1, 3,0,
      blr_varying2, 52,0, 12,0,
      blr_short, 0,
      blr_short, 0,
   blr_begin,
      blr_declare, 0,0, blr_varying2, 52,0, 12,0,
      blr_assignment,
         blr_null,
         blr_variable, 0,0,
      blr_stall,
      blr_label, 0,
         blr_begin,
            blr_begin,
               blr_for,   // select 
                  blr_singular,    // first 1 
                     blr_rse, 1,  
                        blr_relation, 16, 'T','B','L','_','D','R','O','P','_','T','A','B','L','E','_','A', 0, 
                        blr_first,
                           blr_literal, blr_long, 0, 1,0,0,0,
                        blr_end,
                  blr_begin,
                      blr_assignment,   // перенос значения... 
                        blr_field, 0, 8, 'F','L','D','_','C','H','A','R', 
                        blr_variable, 0,0,  // ...во временную переменную (а почему не сразу параметр?) 
                     blr_end,

Вот я и предположил, что под капотом у blr_assignment, раз он не просит информацию о типе поля, вычитка значения из текущей записи с учётом текущего формата.

Это должно распространяться не только на ХП, но и на триггеры, насколько я понимаю, и на вычисляемые поля - BLR у них всех по одним правилам должен строиться.

Да, и ещё вопросик маленький, где найти BLR syntax guide? Ссылки находятся, но все как назло битые. Или он устарел уже?
...
Рейтинг: 0 / 0
Перекомпиляция ХП и alter column type
    #38831830
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrCat,

место, куда копируется поле (blr_message / blr_parameter / blr_variable) тоже должны измениться. Для этого требуется перекомпиляция.
...
Рейтинг: 0 / 0
Перекомпиляция ХП и alter column type
    #38831832
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Mrcat!
You wrote on 11 декабря 2014 г. 18:27:44:

Mrcat> где найти BLR syntax guide? ты путаешь с GDML.
BLR всегда был для внутреннего использования.
никаких syntax guide.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Перекомпиляция ХП и alter column type
    #38831837
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrCatПрав ли я, полагая, что перекомпилировать процедуру в этом случае не нужно при
любых Y?
Нет. Тебе может повезти и неявное преобразование типов сработает. Или не повезти и при
выполнении процедуры/триггера будет выбрасываться исключение.

Лично я считаю разрешение alter используемого поля багом, но разработчикам нравится давать
пользователям длинные верёвки...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Перекомпиляция ХП и alter column type
    #38831902
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrMrCat,

место, куда копируется поле (blr_message / blr_parameter / blr_variable) тоже должны измениться. Для этого требуется перекомпиляция.Чтобы они изменились, нужно чтобы юзер их явно поменял в тексте. Этого без перекомпиляции не добиться, есс-но.
Но, если получатель имеет и без того совместимый тип, то перекомпиляция не нужна.
Нужна пере-загрузка в кеш метаданных. Которую гарантирует перекомпиляция :)
...
Рейтинг: 0 / 0
Перекомпиляция ХП и alter column type
    #38831911
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2dmitr,
В том-то и дело, что BLR не меняется, в blr_message размер неизменного varchar-параметра ХП, а не поля.

Вот что я делаю:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create table ...(
  F1 varchar(10)); 

create procedure Test 
returns(
  param varchar(12))
as begin
  select F1 ...
  into :param ...
end;

-- читаю BLR свежесозданной процедуры

alter table ... alter column F1 type varchar(11);

-- перекомпилирую ХП ничего в ней не меняя, снова читаю BLR. 
-- И он полностью совпадает со старым. Что и логично, потому 
-- что в старом нигде нет 10, а в новом нет 11 - нечему меняться



BLR полностью
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
blr_version5,
blr_begin,
   blr_message, 1, 3,0,
      blr_varying2, 52,0, 12,0,
      blr_short, 0,
      blr_short, 0,
   blr_begin,
      blr_declare, 0,0, blr_varying2, 52,0, 12,0,
      blr_assignment,
         blr_null,
         blr_variable, 0,0,
      blr_stall,
      blr_label, 0,
         blr_begin,
            blr_begin,
               blr_for,
                  blr_singular,
                     blr_rse, 1,
                        blr_relation, 16, 'T','B','L','_','D','R','O','P','_','T','A','B','L','E','_','A', 0,
                        blr_first,
                           blr_literal, blr_long, 0, 1,0,0,0,
                        blr_end,
                  blr_begin,
                     blr_assignment,
                        blr_field, 0, 8, 'F','L','D','_','C','H','A','R',
                        blr_variable, 0,0,
                     blr_end,
               blr_begin,
                  blr_send, 1,
                     blr_begin,
                        blr_assignment,
                           blr_variable, 0,0,
                           blr_parameter2, 1, 0,0, 1,0,
                        blr_assignment,
                           blr_literal, blr_short, 0, 1,0,
                           blr_parameter, 1, 2,0,
                        blr_end,
                  blr_stall,
                  blr_end,
               blr_end,
            blr_end,
      blr_end,
   blr_send, 1,
      blr_begin,
         blr_assignment,
            blr_variable, 0,0,
            blr_parameter2, 1, 0,0, 1,0,
         blr_assignment,
            blr_literal, blr_short, 0, 0,0,
            blr_parameter, 1, 2,0,
         blr_end,
   blr_end,
blr_eoc


2Мимопроходящий,
не-не, именно BLR, т.е. результат компиляции, а не исходный текст запроса. Нашёл какие-то вырезки здесь .

2Dimitry Sibiryakov,
это да - ошибка приведения типа, аналог EConvertError, вполне может вылезти, мне важно, чтобы не полез аналог access violation. Т.е. чтобы не сломалась вычитка нового формата старым BLR.

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

2hvlad,
Если BLR не меняется, то тогда и кэш метаданных обновлять не нужно. Ошибка с кэшем не сработает, к счастью, ещё и потому, что обновление метаданных должно проводиться при отключённых пользователях, по-хорошему. Т.е. когда отвалится единственный обновляющий коннект, почистится и кэш.
...
Рейтинг: 0 / 0
Перекомпиляция ХП и alter column type
    #38831920
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alter column type допускает не всякие преобразования, а только совместимые по типу. Т.е. нельзя перегнать varchar в integer с его помощью, а наоборот - можно. Выше hvlad говорит, что при "совместимых" изменениях компоненты BLR не поменяются. Вот я и спрашиваю, по сути, о том - одна и та же ли это совместимость ? Следует ли из удачи Alter column type неизменность BLR? (Интерфейс ХП пока не трогаем, понятно, что если там type of column от изменяемого поля, то ХП нужно пересоздать).
...
Рейтинг: 0 / 0
Перекомпиляция ХП и alter column type
    #38831924
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrCatне-не, именно BLR
по BLR никогда не было документации, потому что это внутренний формат. Никто кроме движка, и если я правильно помню, gpre, не генерирует BLR. А следовательно, ни к чему его описания, потому что руками все равно blr модифицировать никто не будет.
...
Рейтинг: 0 / 0
Перекомпиляция ХП и alter column type
    #38831925
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrCatнельзя перегнать varchar в integer с его помощью, а наоборот - можно.
Правильно. И если раньше значения без проблем присваивались целой переменной, то после
этого настанет облом. То же самое с расширением текстового поля.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Перекомпиляция ХП и alter column type
    #38831940
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЛично я считаю разрешение alter используемого поля багом, но разработчикам нравится давать
пользователям длинные верёвки
Хм. А где можно почитать аргументацию этого решения? А то я что-то не понимаю, где от такого поведения вообще будет польза.
...
Рейтинг: 0 / 0
Перекомпиляция ХП и alter column type
    #38831950
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonlineА где можно почитать аргументацию этого решения?
Какая может быть аргументация личных предпочтений?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Перекомпиляция ХП и alter column type
    #38831972
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miwaonlineDimitry SibiryakovЛично я считаю разрешение alter используемого поля багом, но разработчикам нравится давать
пользователям длинные верёвки
Хм. А где можно почитать аргументацию этого решения? А то я что-то не понимаю, где от такого поведения вообще будет польза.

Я попробую:

допустим, пользователю запретили изменять поле, если от него зависит PSQL. Тогда пользователь закомментирует тела всех зависящих PSQL-кусков или заменит их заглушками, откомпилирует их, изменит поле, потом поснимает комментарии и заглушки и снова откомпилирует PSQL. Запрет alter'a не заставит его следить за ошибками конвертации, не откроет ему потенциальные места в коде, где ошибки могли возникнуть - список зависимостей он и раньше видел, а только заставят бесцельно попотеть.
...
Рейтинг: 0 / 0
Перекомпиляция ХП и alter column type
    #38831978
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
н-да, и особенно это всё весело смотрится, когда в результате сих перекомпиляций у PSQL BLR не меняется)))

Сдаётся мне, что ошибки конвертации из-за смены формата - это только частный случай таких ошибок из-за смены типа данных вообще. Точно так же можно говорить о некорректности всех зависящих объектов при изменении классическим способом (через буферное поле) любого поля БД.
...
Рейтинг: 0 / 0
Перекомпиляция ХП и alter column type
    #38831983
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё же переформулирую ещё раз свой вопрос, чтобы избежать растекания:

* есть поле и PSQL, который использует его.
* компилирую его и вычитываю BLR, это будет BLR1
* теперь меняю используемое поле через alter column type (успешно - commit проходит без исключения!)
* перекомпилирую PSQL, ничего в нём не меняя (тоже commit успешный)
* снова вычитываю BLR, это будет BLR2.

всегда ли при таких условиях BLR1 = BLR2?

Сам я затрудняюсь придумать пример, когда это не так. Type of column и простая ссылка на поле дают в BLR blr_assignment, который ссылается на имя поля, а имя поля не меняется. Т.е. очень похоже, что всегда BLR1 = BLR2.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Перекомпиляция ХП и alter column type
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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