Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Перекомпиляция зависимых процедур / 25 сообщений из 25, страница 1 из 1
16.03.2020, 18:02
    #39937949
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекомпиляция зависимых процедур
Когда я меняю тело процедуры, то при ее компиляции, при наличии соответствующей настройки, перекомпилируются все зависимые от нее процедуры и триггеры.

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

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

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


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

Хрен с ними с пакетами. Для обычных функций можно recompile сделать?
...
Рейтинг: 0 / 0
17.06.2020, 15:13
    #39970231
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекомпиляция зависимых процедур
А оно в тройке и выше точно необходимо? Или чтобы было?
...
Рейтинг: 0 / 0
17.06.2020, 15:37
    #39970246
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекомпиляция зависимых процедур
IBExpert
А оно в тройке и выше точно необходимо?
Да. Я проверял на 3.0.5. Без перекомпиляции используется старая версия
...
Рейтинг: 0 / 0
17.06.2020, 15:44
    #39970248
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекомпиляция зависимых процедур
_Vasilisk_
Я проверял
Так. Что-то не повторяется. Сейчас посмотрю детальнее
...
Рейтинг: 0 / 0
17.06.2020, 15:56
    #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
17.06.2020, 16:04
    #39970257
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекомпиляция зависимых процедур
_Vasilisk_

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


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

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

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

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

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

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

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


Разница между вот этими действиями и твоим скриптом выше, который подхватывает изменения сразу, только в параметрах транзакций, наверное. Больше что-то ничего в голову не приходит.
...
Рейтинг: 0 / 0
22.06.2020, 15:41
    #39971879
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекомпиляция зависимых процедур
IBExpert
только в параметрах транзакций,
...
Рейтинг: 0 / 0
22.06.2020, 15:47
    #39971881
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекомпиляция зависимых процедур
alekcvp
А если просто закрыть SQL-редактор и открыть заново?
То же самое. Только реконнект
...
Рейтинг: 0 / 0
22.06.2020, 16:58
    #39971930
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекомпиляция зависимых процедур
Ну, я не знаю, почему в одном случае изменения подхватываются сразу, а в другом - только после реконнекта.
Это нужно у серверописателей спрашивать.
...
Рейтинг: 0 / 0
22.06.2020, 19:03
    #39971996
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекомпиляция зависимых процедур
IBExpert
Это нужно у серверописателей спрашивать.
У тебя оно повторяется?
...
Рейтинг: 0 / 0
23.06.2020, 04:22
    #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
23.06.2020, 04:25
    #39972136
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекомпиляция зависимых процедур
А вот почему после выполнения твоего скрипта показывает 990, а не 50 - ХЗ. Перекомпиляции-то sp_test там нет.
...
Рейтинг: 0 / 0
23.06.2020, 13:54
    #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
23.06.2020, 14:16
    #39972403
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекомпиляция зависимых процедур
_Vasilisk_,

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

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

ну ты молодец конечно, EXECUTE PROCEDURE сделал, а коммит нет. Естественно она торчит в кеше метаданных и её не может выкинуть даже wait транзакция
...
Рейтинг: 0 / 0
23.06.2020, 15:19
    #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
23.06.2020, 15:44
    #39972458
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекомпиляция зависимых процедур
_Vasilisk_,

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


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

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


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