powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Перекомпиляция зависимых процедур
25 сообщений из 25, страница 1 из 1
Перекомпиляция зависимых процедур
    #39937949
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда я меняю тело процедуры, то при ее компиляции, при наличии соответствующей настройки, перекомпилируются все зависимые от нее процедуры и триггеры.

А вот когда я меняю тело функции, зависимые объекты не перекомпилируются.

Аналогично при модификации пакетных процедур и функций

Также при перекомпиляции обычных процедур не перекомпилируются зависимые от нее функции и пакеты


С уважением, Vasilisk
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39970216
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Up?

Хрен с ними с пакетами. Для обычных функций можно recompile сделать?
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39970231
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А оно в тройке и выше точно необходимо? Или чтобы было?
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39970246
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
А оно в тройке и выше точно необходимо?
Да. Я проверял на 3.0.5. Без перекомпиляции используется старая версия
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39970248
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Я проверял
Так. Что-то не повторяется. Сейчас посмотрю детальнее
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39970255
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оказалось не все так плохо.

Изменения не видятся, если редактировать объекты в IBExpert. Но до реконнекта. После реконнекта все работает.

А такой скрипт
Код: sql
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.
SET TERM ^ ;

CREATE OR ALTER PROCEDURE sp_test
RETURNS (
  out_val INTEGER)
AS
BEGIN
  out_val = 50;
END^

CREATE OR ALTER FUNCTION sf_t1
RETURNS INTEGER
AS
DECLARE VARIABLE var_res INTEGER;
BEGIN
  EXECUTE PROCEDURE sp_test RETURNING_VALUES (:var_res);
  RETURN :var_res;
END^

CREATE OR ALTER PROCEDURE sp_test
RETURNS (
  out_val INTEGER)
AS
BEGIN
  out_val = 990;
END^

EXECUTE ibeblock
AS
BEGIN
  var_res = sf_t1();
  ibec_ShowMessage(:var_res);
END^

SET TERM ; ^

подхватывает изменения сразу
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39970257
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_

А такой скрипт
подхватывает изменения сразу


Так тут нет перекомпиляции зависимой функции sf_t1 после последнего изменения процедуры sp_test.
И оно, ты говоришь, нормально работает.
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39970258
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
Так тут нет перекомпиляции зависимой функции sf_t1 после последнего изменения процедуры sp_test.
И оно, ты говоришь, нормально работает.
Правильно. Я изначально ошибся.

Я нарвался на такое поведение
_Vasilisk_
Изменения не видятся, если редактировать объекты в IBExpert. Но до реконнекта.
И подумал, что это навсегда.
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39970265
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я у себя проверил - нормально все видится и без реконнекта. А ты как проверяешь?
Ну, к перекомпиляции это в любом случае никакого отношения не имеет.
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39970284
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
А ты как проверяешь?
Открываю SQL Editor. Пишу
Код: sql
1.
SELECT sf_t1() FROM rdb$database

вижу текущее значение из sp_test

Модифицирую sp_test, возвращаюсь в SQL Editor, откатываю текущую транзакцию и выполняю запрос опять. Вижу старое значение из sp_test

Делаю реконнект, выполняю запрос и вижу новое значение
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39970472
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Модифицирую sp_test, возвращаюсь в SQL Editor, откатываю текущую транзакцию и выполняю запрос опять. Вижу старое значение из sp_test
Делаю реконнект, выполняю запрос и вижу новое значение

А если просто закрыть SQL-редактор и открыть заново?
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39970743
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_

Модифицирую sp_test, возвращаюсь в SQL Editor, откатываю текущую транзакцию и выполняю запрос опять. Вижу старое значение из sp_test


Разница между вот этими действиями и твоим скриптом выше, который подхватывает изменения сразу, только в параметрах транзакций, наверное. Больше что-то ничего в голову не приходит.
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39971879
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
только в параметрах транзакций,
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39971881
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
А если просто закрыть SQL-редактор и открыть заново?
То же самое. Только реконнект
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39971930
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, я не знаю, почему в одном случае изменения подхватываются сразу, а в другом - только после реконнекта.
Это нужно у серверописателей спрашивать.
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39971996
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
Это нужно у серверописателей спрашивать.
У тебя оно повторяется?
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39972135
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
У тебя оно повторяется?


Так... Попробовал еще раз, на тройке (а в прошлый раз на четверке пробовал, оказывается, и уже точно не помню, что именно).
Итак:

1. Выполняем твой скрипт - видим 990.

2. После этого выполняем такой скрипт:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE OR ALTER PROCEDURE sp_test
RETURNS (
  out_val INTEGER)
AS
BEGIN
  out_val = 12345;
END;

EXECUTE ibeblock
AS
BEGIN
  var_res = sf_t1();
  ibec_ShowMessage(:var_res);
END;


И снова видим 990...

3. А если скрипт такой:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE OR ALTER PROCEDURE sp_test
RETURNS (
  out_val INTEGER)
AS
BEGIN
  out_val = 333;
END;

CREATE OR ALTER FUNCTION sf_t1
RETURNS INTEGER
AS
DECLARE VARIABLE var_res INTEGER;
BEGIN
  EXECUTE PROCEDURE sp_test RETURNING_VALUES (:var_res);
  RETURN :var_res;
END;

EXECUTE ibeblock
AS
BEGIN
  var_res = sf_t1();
  ibec_ShowMessage(:var_res);
END;


то сразу видим 333.

Т.е., перекомпиляция sf_t1 после изменения sp_test таки решает проблему.
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39972136
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот почему после выполнения твоего скрипта показывает 990, а не 50 - ХЗ. Перекомпиляции-то sp_test там нет.
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39972386
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
2. После этого выполняем такой скрипт:
А если перед ним вставить RECONNECT, то все нормально работает.

Похоже на то, что при первом вызове sp_test она попадает в кеш и там уже сидит до дисконнекта.

Вот Денис Симонов описывал здесь 22148821 такое поведение для UDR
Симонов Денис
Экземпляр процедуры создаётся в момент её загрузки в кэш метаданных
И похоже, что именно с этим связана невозможность перекомпиляции процедуры если она была вызвана в другом коннекте, до уничтожения этого коннекта.

Ну и тест, который это подтверждает
Код: sql
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.
CREATE OR ALTER PROCEDURE sp_test
RETURNS (
  out_val INTEGER)
AS
BEGIN
  out_val = 50;
END;

CREATE OR ALTER FUNCTION sf_t1
RETURNS INTEGER
AS
DECLARE VARIABLE var_res INTEGER;
BEGIN
  EXECUTE PROCEDURE sp_test RETURNING_VALUES (:var_res);
  RETURN :var_res;
END;

EXECUTE PROCEDURE sp_test;

CREATE OR ALTER PROCEDURE sp_test
RETURNS (
  out_val INTEGER)
AS
BEGIN
  out_val = 990;
END;

EXECUTE ibeblock
AS
BEGIN
  var_res = sf_t1();
  ibec_ShowMessage(:var_res);
END;

RECONNECT;

EXECUTE ibeblock
AS
BEGIN
  var_res = sf_t1();
  ibec_ShowMessage(:var_res);
END;

...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39972403
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

wait транзакция может обновить/ивалидировать процедуру в кеше метаданных. Очевидно ты эту процедуру в другой закладке в запросике использовал

19140159
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39972408
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

ну ты молодец конечно, EXECUTE PROCEDURE сделал, а коммит нет. Естественно она торчит в кеше метаданных и её не может выкинуть даже wait транзакция
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39972443
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
wait транзакция может обновить/ивалидировать процедуру в кеше метаданных
Интересно. Спасибо.
Симонов Денис
Очевидно ты эту процедуру в другой закладке в запросике использовал
Т.е. если на момент компиляции процедуры была активная транзакция, которая использовала эту процедуру, то процедура в кеше остается навечно. Но при этом она убирается из кеша, если произошла перекомпиляция вызывающей функции. Так?
Симонов Денис
Естественно она торчит в кеше метаданных и её не может выкинуть даже wait транзакция
При этом коммит после перекомпиляции уже ни на что не влияет.

Код: sql
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.
CREATE OR ALTER PROCEDURE sp_test
RETURNS (
  out_val INTEGER)
AS
BEGIN
  out_val = 50;
END;

CREATE OR ALTER FUNCTION sf_t1
RETURNS INTEGER
AS
DECLARE VARIABLE var_res INTEGER;
BEGIN
  EXECUTE PROCEDURE sp_test RETURNING_VALUES (:var_res);
  RETURN :var_res;
END;

EXECUTE PROCEDURE sp_test;

-- COMMIT;

CREATE OR ALTER PROCEDURE sp_test
RETURNS (
  out_val INTEGER)
AS
BEGIN
  out_val = 990;
END;

COMMIT;

EXECUTE ibeblock
AS
BEGIN
  var_res = sf_t1();
  ibec_ShowMessage(:var_res);
END;

В зависимости от состояния первого коммита (закомментировано/раскомментировано) мы получим или 50 или 990. Второй комит ни на что не влияет
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39972458
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

естественно, читай комментарий ДЕ.
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39972515
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
]При этом коммит после перекомпиляции уже ни на что не влияет.


Там коммитить нечего, все DDL по умолчанию коммитятся сразу после выполнения.
В общем, я ничего не понял. Перекомпиляция таки нужна или достаточно просто wait в свойствах транзакции прописать?
...
Рейтинг: 0 / 0
Перекомпиляция зависимых процедур
    #39972527
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
Перекомпиляция таки нужна
Пожалуй, нет. Спишем на особенность работы FB

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


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