Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Удаление функции, которая используется в других процедурах / 5 сообщений из 5, страница 1 из 1
21.03.2012, 18:22
    #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
21.03.2012, 18:23
    #37716458
emctl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление функции, которая используется в других процедурах
Да, забыл - DB2 Version 9.7 for Linux, UNIX, and Windows
...
Рейтинг: 0 / 0
21.03.2012, 21:53
    #37716841
Абсолют
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление функции, которая используется в других процедурах
emctl,

Пакеты процедур, видимо, остаются. Хотя, я сильно не уверен. Либо зависимые объекты становятся не валидными.
...
Рейтинг: 0 / 0
22.03.2012, 10:40
    #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
22.03.2012, 18:09
    #37718554
CawaSPb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление функции, которая используется в других процедурах
BTW Для некоторых случаев интересен auto_reval=DEFERRED_FORCE, когда можно создавать невалидные объекты (которые будут ревалидированы по факту обращения, или которые можно ревалидировать скопом с помощью call ADMIN_REVALIDATE_DB_OBJECTS()).
Значение auto_reval можно менять на ходу.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Удаление функции, которая используется в других процедурах / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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