powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Удаление функции, которая используется в других процедурах
5 сообщений из 5, страница 1 из 1
Удаление функции, которая используется в других процедурах
    #37716450
emctl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Есть функция my_func, которая используется в других процедурах. В документации есть такой текст:
DB2 Version 9.7 for Linux, UNIX, and Windows A routine cannot be dropped if a view, trigger, table check constraint, or another routine is dependent on it. If DB2® cannot drop a dependent routine, DB2 does not drop the UDT

Т.е., я не могу удалить любую хранимку, если она где-то используется. Так вот, моя используется и даже можно это проверить через каталоговские таблицы:
Код: plsql
1.
2.
3.
4.
5.
SELECT dep.*, r2.ROUTINENAME
  FROM sysibm.sysdependencies dep JOIN syscat.routines r ON dep.bname = r.specificname
 left  join  syscat.routines r2
 on dep.DNAME = r2.SPECIFICNAME
 WHERE upper (r.routinename) = 'my_func'



Но! Я спокойно делаю drop function my_func, и даже зависимости в запросе выше удаляются....
Где я чего не понял?
...
Рейтинг: 0 / 0
Удаление функции, которая используется в других процедурах
    #37716458
emctl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, забыл - DB2 Version 9.7 for Linux, UNIX, and Windows
...
Рейтинг: 0 / 0
Удаление функции, которая используется в других процедурах
    #37716841
Фотография Абсолют
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
emctl,

Пакеты процедур, видимо, остаются. Хотя, я сильно не уверен. Либо зависимые объекты становятся не валидными.
...
Рейтинг: 0 / 0
Удаление функции, которая используется в других процедурах
    #37717330
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
emctlДобрый день.
Есть функция my_func, которая используется в других процедурах. В документации есть такой текст:
DB2 Version 9.7 for Linux, UNIX, and Windows A routine cannot be dropped if a view, trigger, table check constraint, or another routine is dependent on it. If DB2® cannot drop a dependent routine, DB2 does not drop the UDT

Т.е., я не могу удалить любую хранимку, если она где-то используется. Так вот, моя используется и даже можно это проверить через каталоговские таблицы:
Код: plsql
1.
2.
3.
4.
5.
SELECT dep.*, r2.ROUTINENAME
  FROM sysibm.sysdependencies dep JOIN syscat.routines r ON dep.bname = r.specificname
 left  join  syscat.routines r2
 on dep.DNAME = r2.SPECIFICNAME
 WHERE upper (r.routinename) = 'my_func'



Но! Я спокойно делаю drop function my_func, и даже зависимости в запросе выше удаляются....
Где я чего не понял?Добрый день.

Зависит от параметра БД auto_reval .
См. также Automatic revalidation of database objects .
Пример
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create function child(i int)
returns int
return i@

create function parent(i int)
returns int
return child(i)@

create procedure parent(i int, out o int)
begin
  set o = child(i);
end@

select p.valid
from syscat.routines r
join syscat.routinedep d on d.routineschema=r.routineschema and d.specificname=r.specificname
join syscat.packages p on p.pkgschema=d.bschema and p.pkgname=d.bname
where d.btype='K' and r.routineschema=user and r.routinename='PARENT'@

Если auto_reval=DEFERRED, как по-умолчанию у вновь создаваемых баз, то вы можете сделать 'drop function child', и оно пройдёт успешно.
Последний запрос вернёт X (inoperative package), и, естественно, ни процедура, ни функция parent работать не будут.
Когда вы снова создадите child, можно будет сразу вызывать процедуру и функцию parent (пакет для процедуры неявно починится).

Если auto_reval=DISABLED (умолчание для смигрированных баз), то оно не даст вам удалить child, т.к. есть функция parent.
Если бы функции parent не было, то оно бы дало удалить child, несмотря на то, что есть процедура, от неё зависящая. Но пакет этой процедуры всё равно станет inoperative, и при каждом call parent будет предприниматься неявная попытка исправить этот пакет (так же как и при auto_reval=DEFERRED). Т.е. и здесь после пересоздания child можно сразу вызывать call parent.
...
Рейтинг: 0 / 0
Удаление функции, которая используется в других процедурах
    #37718554
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BTW Для некоторых случаев интересен auto_reval=DEFERRED_FORCE, когда можно создавать невалидные объекты (которые будут ревалидированы по факту обращения, или которые можно ревалидировать скопом с помощью call ADMIN_REVALIDATE_DB_OBJECTS()).
Значение auto_reval можно менять на ходу.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Удаление функции, которая используется в других процедурах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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