Решение проблем при удалении процедур

KDV, www.ibase.ru

При изменении параметров вложенных (вызываемых) процедур возникает проблема, при которой невозможно удалить или изменить внешнюю (вызывающую) процедуру. При попытке сделать это возникает сообщение вроде "invalid BLR". Решить эту проблему можно следующим способом:
  1. сохранить где-нибудь вне базы данных (хоть в текстовом файле) исходный текст процедуры, которую надо удалить.
  2. создать "пустую" процедуру
create procedure DUMMY as begin exit; end
  1. скопировать blr пустой процедуры в blr "испорченной":
UPDATE RDB$PROCEDURES   
   SET RDB$PROCEDURE_BLR = (SELECT RDB$PROCEDURE_BLR FROM RDB$PROCEDURES
                            WHERE RDB$PROCEDURE_NAME = 'DUMMY')
WHERE RDB$PROCEDURE_NAME = 'MYBADPROC'
выполнять эту команду надо с большой осторожностью, чтобы случайно не "очистисть" другие процедуры.
  1. удалить процедуру
DROP PROCEDURE MYBADPROC;
  1. создать процедуру MYBADPROC по новой (из сохраненного текста)
Вообще можно было бы поступить и проще, например без удаления – т. е. создать в качестве DUMMY правильную процедуру, и заменить испорченный blr на правильный. Однако, при этом придется процедуру DUMMY сохранить, т. к. если ее удалить, удалятся все описания параметров процедуры, которые создаются в RDB$PROCEDURE_PARAMETERS.

Вы сами можете проверить предлагаемый способ и его варианты на тестовой базе данных.

Подпишитесь на новости Firebird в России

Подписаться