Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Перекомпиляция ХП и alter column type
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, у меня вопрос: вот есть, положим, некоторая ХП, пусть она в процессе работы получает значение из какого-то поля типа X. В один день к этому полю применяется alter table ... alter column ... type Y - удачно, т.е. формат поля меняется. При этом процедура написана так, что менять интерфейс или исходный код процедуры при смене формата поля не нужно. Прав ли я, полагая, что перекомпилировать процедуру в этом случае не нужно при любых Y? предыстория Написал процедуру: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Смотрю 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_assignment, раз он не просит информацию о типе поля, вычитка значения из текущей записи с учётом текущего формата. Это должно распространяться не только на ХП, но и на триггеры, насколько я понимаю, и на вычисляемые поля - BLR у них всех по одним правилам должен строиться. Да, и ещё вопросик маленький, где найти BLR syntax guide? Ссылки находятся, но все как назло битые. Или он устарел уже? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2014, 18:24 |
|
||
|
Перекомпиляция ХП и alter column type
|
|||
|---|---|---|---|
|
#18+
MrCat, место, куда копируется поле (blr_message / blr_parameter / blr_variable) тоже должны измениться. Для этого требуется перекомпиляция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2014, 18:29 |
|
||
|
Перекомпиляция ХП и alter column type
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2014, 18:29 |
|
||
|
Перекомпиляция ХП и alter column type
|
|||
|---|---|---|---|
|
#18+
MrCatПрав ли я, полагая, что перекомпилировать процедуру в этом случае не нужно при любых Y? Нет. Тебе может повезти и неявное преобразование типов сработает. Или не повезти и при выполнении процедуры/триггера будет выбрасываться исключение. Лично я считаю разрешение alter используемого поля багом, но разработчикам нравится давать пользователям длинные верёвки... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2014, 18:32 |
|
||
|
Перекомпиляция ХП и alter column type
|
|||
|---|---|---|---|
|
#18+
dimitrMrCat, место, куда копируется поле (blr_message / blr_parameter / blr_variable) тоже должны измениться. Для этого требуется перекомпиляция.Чтобы они изменились, нужно чтобы юзер их явно поменял в тексте. Этого без перекомпиляции не добиться, есс-но. Но, если получатель имеет и без того совместимый тип, то перекомпиляция не нужна. Нужна пере-загрузка в кеш метаданных. Которую гарантирует перекомпиляция :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2014, 19:42 |
|
||
|
Перекомпиляция ХП и alter column type
|
|||
|---|---|---|---|
|
#18+
2dmitr, В том-то и дело, что BLR не меняется, в blr_message размер неизменного varchar-параметра ХП, а не поля. Вот что я делаю: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 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. 2Мимопроходящий, не-не, именно BLR, т.е. результат компиляции, а не исходный текст запроса. Нашёл какие-то вырезки здесь . 2Dimitry Sibiryakov, это да - ошибка приведения типа, аналог EConvertError, вполне может вылезти, мне важно, чтобы не полез аналог access violation. Т.е. чтобы не сломалась вычитка нового формата старым BLR. Сейчас я принудительно перекомпилирую все зависящие от изменяемого поля процедуры - вне зависимости, поменяется там BLR после компиляции или нет. Но, похоже, не во всех случаях это нужно делать. Часть процедур можно не перекомпилировать, даже при живых зависимостях, если знать наперёд - поменяется их BLR или нет. 2hvlad, Если BLR не меняется, то тогда и кэш метаданных обновлять не нужно. Ошибка с кэшем не сработает, к счастью, ещё и потому, что обновление метаданных должно проводиться при отключённых пользователях, по-хорошему. Т.е. когда отвалится единственный обновляющий коннект, почистится и кэш. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2014, 20:09 |
|
||
|
Перекомпиляция ХП и alter column type
|
|||
|---|---|---|---|
|
#18+
Alter column type допускает не всякие преобразования, а только совместимые по типу. Т.е. нельзя перегнать varchar в integer с его помощью, а наоборот - можно. Выше hvlad говорит, что при "совместимых" изменениях компоненты BLR не поменяются. Вот я и спрашиваю, по сути, о том - одна и та же ли это совместимость ? Следует ли из удачи Alter column type неизменность BLR? (Интерфейс ХП пока не трогаем, понятно, что если там type of column от изменяемого поля, то ХП нужно пересоздать). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2014, 20:26 |
|
||
|
Перекомпиляция ХП и alter column type
|
|||
|---|---|---|---|
|
#18+
MrCatне-не, именно BLR по BLR никогда не было документации, потому что это внутренний формат. Никто кроме движка, и если я правильно помню, gpre, не генерирует BLR. А следовательно, ни к чему его описания, потому что руками все равно blr модифицировать никто не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2014, 20:35 |
|
||
|
Перекомпиляция ХП и alter column type
|
|||
|---|---|---|---|
|
#18+
MrCatнельзя перегнать varchar в integer с его помощью, а наоборот - можно. Правильно. И если раньше значения без проблем присваивались целой переменной, то после этого настанет облом. То же самое с расширением текстового поля. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2014, 20:36 |
|
||
|
Перекомпиляция ХП и alter column type
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЛично я считаю разрешение alter используемого поля багом, но разработчикам нравится давать пользователям длинные верёвки Хм. А где можно почитать аргументацию этого решения? А то я что-то не понимаю, где от такого поведения вообще будет польза. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2014, 21:24 |
|
||
|
Перекомпиляция ХП и alter column type
|
|||
|---|---|---|---|
|
#18+
miwaonlineА где можно почитать аргументацию этого решения? Какая может быть аргументация личных предпочтений?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2014, 21:55 |
|
||
|
Перекомпиляция ХП и alter column type
|
|||
|---|---|---|---|
|
#18+
miwaonlineDimitry SibiryakovЛично я считаю разрешение alter используемого поля багом, но разработчикам нравится давать пользователям длинные верёвки Хм. А где можно почитать аргументацию этого решения? А то я что-то не понимаю, где от такого поведения вообще будет польза. Я попробую: допустим, пользователю запретили изменять поле, если от него зависит PSQL. Тогда пользователь закомментирует тела всех зависящих PSQL-кусков или заменит их заглушками, откомпилирует их, изменит поле, потом поснимает комментарии и заглушки и снова откомпилирует PSQL. Запрет alter'a не заставит его следить за ошибками конвертации, не откроет ему потенциальные места в коде, где ошибки могли возникнуть - список зависимостей он и раньше видел, а только заставят бесцельно попотеть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2014, 22:35 |
|
||
|
Перекомпиляция ХП и alter column type
|
|||
|---|---|---|---|
|
#18+
н-да, и особенно это всё весело смотрится, когда в результате сих перекомпиляций у PSQL BLR не меняется))) Сдаётся мне, что ошибки конвертации из-за смены формата - это только частный случай таких ошибок из-за смены типа данных вообще. Точно так же можно говорить о некорректности всех зависящих объектов при изменении классическим способом (через буферное поле) любого поля БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2014, 22:53 |
|
||
|
Перекомпиляция ХП и alter column type
|
|||
|---|---|---|---|
|
#18+
Всё же переформулирую ещё раз свой вопрос, чтобы избежать растекания: * есть поле и PSQL, который использует его. * компилирую его и вычитываю BLR, это будет BLR1 * теперь меняю используемое поле через alter column type (успешно - commit проходит без исключения!) * перекомпилирую PSQL, ничего в нём не меняя (тоже commit успешный) * снова вычитываю BLR, это будет BLR2. всегда ли при таких условиях BLR1 = BLR2? Сам я затрудняюсь придумать пример, когда это не так. Type of column и простая ссылка на поле дают в BLR blr_assignment, который ссылается на имя поля, а имя поля не меняется. Т.е. очень похоже, что всегда BLR1 = BLR2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2014, 23:10 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38831925&tid=1563142]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
176ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 271ms |

| 0 / 0 |
