Не удается удалить из базы данных ...?
Вопрос
Итак, у меня есть 2 экземпляра базы данных, один предназначен для разработки в целом, другой был скопирован из разработки для модульных тестов.
Что-то изменилось в базе данных разработки, что я не могу понять, и я не знаю, как увидеть, что изменилось.
Когда я пытаюсь удалить из определенной таблицы, например, с помощью:
delete from myschema.mytable where id = 555
Я получаю следующий обычный ответ от базы данных модульного тестирования, указывающий, что ни одна строка не была удалена:
SQL0100W Не найдено ни одной строки для ИЗВЛЕЧЕНИЯ, ОБНОВЛЕНИЯ или УДАЛЕНИЯ;или результатом запроса является пустая таблица.SQLSTATE=02000
Однако базе данных разработки вообще не удается выполнить удаление со следующей ошибкой:
DB21034E Команда была обработана как оператор SQL, поскольку она не была допустимой командой процессора командной строки.Во время обработки SQL он вернул:SQL0440N Не найдено авторизованной подпрограммы с именем "=" типа "ФУНКЦИЯ", имеющей совместимые аргументы.SQLSTATE=42884
Мое лучшее предположение заключается в том, что есть какой-то триггер или представление, которое было добавлено или изменено, что вызывает проблему, но я понятия не имею, как найти проблему...кто-нибудь сталкивался с этой проблемой или знает, как выяснить, в чем корень проблемы?
(обратите внимание, что это база данных DB2)
Решение
Хм, применив великого оракула к этому вопросу, я пришел к следующему:
http://bytes.com/forum/thread830774.html
Кажется, это предполагает, что в другой таблице есть внешний ключ, указывающий на проблемный, когда этот FK в другой таблице удален, удаление должно сработать снова.(Предположительно, вы также можете повторно создать внешний ключ)
Помогает ли это кому-нибудь?
Другие советы
Возможно, у вас есть открытая транзакция в базе данных разработчиков ... которая иногда приводит меня на SQL Server
Совместим ли этот тип идентификатора с 555?Или он был изменен на нецелочисленный тип?
В качестве альтернативы, не пропадает ли каким-либо образом аргумент 555 (напримересли вы используете JDBC и подготовленный оператор не получил свои аргументы, установленные перед выполнением запроса)?
Можете ли вы добавить что-нибудь еще к своему вопросу?Эта ошибка звучит так, как будто анализатор инструкций sql очень запутался в вашем заявлении.Можете ли вы сделать выбор в этой таблице для строки, где id = 555?
Вы могли бы попробовать запустить таблицу RUNSTATS и REORG для этой таблицы, они должны сортировать шаткие таблицы.
Выбор с тем же условием "где" работает просто отлично, просто не удаляет.Ни runstats, ни reorg table никак не влияют на проблему.
На самом деле мы только что решили проблему, и действительно, это именно то, что вы сказали (коллега тоже нашел эту точно такую же страницу).
Решение состояло в том, чтобы удалить ограничения внешнего ключа и повторно добавить их.
Еще один пост на эту тему:
http://www.ibm.com/developerworks/forums/thread.jspa?threadID=208277&tstart=-1
Это указывает на то, что проблема заключается в повреждении ссылочного ограничения и фактически, или предположительно, в любом случае, исправлена в более поздней версии db2 V9 (которую мы пока не используем).
Спасибо за помощь!
Пожалуйста, проверьте 1.ваши аргументы триггеров, процедур, функций и т.д.2.тип данных аргументов.