KDV, www.ibase.ru
При изменении параметров вложенных (вызываемых) процедур возникает проблема, при которой невозможно удалить или изменить внешнюю (вызывающую) процедуру. При попытке сделать это возникает сообщение вроде "invalid BLR". Решить эту проблему можно следующим способом:
- сохранить где-нибудь вне базы данных (хоть в текстовом файле) исходный текст процедуры, которую надо удалить.
- создать "пустую" процедуру
create procedure DUMMY as begin exit; end
- скопировать 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'
выполнять эту команду надо с большой осторожностью, чтобы случайно не "очистисть" другие процедуры.
- удалить процедуру
DROP PROCEDURE MYBADPROC;
- создать процедуру MYBADPROC по новой (из сохраненного текста)
Вообще можно было бы поступить и проще, например без удаления – т. е. создать в качестве DUMMY правильную процедуру, и заменить испорченный blr на правильный. Однако, при этом придется процедуру DUMMY сохранить, т. к. если ее удалить, удалятся все описания параметров процедуры, которые создаются в RDB$PROCEDURE_PARAMETERS.
Вы сами можете проверить предлагаемый способ и его варианты на тестовой базе данных.