В общем, починил, но судя по всему, вернуться к идее пересоздания базы придётся. Что-то внутри определённо сломано.
Я в ступоре. Описываю процесс.
Разбирательство показало, что на одну и ту же пару системных триггеров с именем CHECK_9 и CHECK_10, которые должны обеспечивать ссылочную целостность, ссылаются как FK_SERTREG, так и check с именем INTEG_236 с другой таблицы (!) LININV, причём тела триггеров определённо для check, а не FK.
Теперь, как я "лечил".
В rdb$triggers создал копию CHECK_9 и CHECK_10 (на всякий случай, с другими именами, 109 и 110).
Создал второй FK2 такой же структуры на SERTREG (FK_SERTREG2), к нему создались системные триггеры CHECK_33 и CHECK_34.
Затем попробовал проапдейтить rdb$triggers CHECK_9 и CHECK_10 значениями из новых триггеров - получил отлуп, сервер не даёт редактировать системные триггеры.
Убил копии CHECK_109 и CHECK_110.
Далее, зашёл в LININV и попробовал убить check INTEG_236. Убился, причём триггера CHECK_9 и CHECK_10 остались.
После этого попробовал убить FK_SERTREG и о чудо! у меня получилось. Радостный, я сразу попробовал прибить и второй, созданный мной в начале "лечения". Облом! Та же ошибка.
Уже зная, куда смотреть, нашёл, что на триггеры CHECK_33 и CHECK_34 теперь ссылается другой check, INTEG_164 из третьей таблицы, который к тому же виден на закладке Checks
Уже прибив его руками в rdb$check_constraints (сервер дал это сделать, хотя на свежей базе, без моих манипуляций, не даёт его же грохнуть) мне удалось прибить и FK_SERTREG2.
Исходя из всей эпопеи, у меня сложилось впечатление, что сбился какой-то внутренний генератор для нумерации триггеров CHECK_n.
Кто-нибудь прокомментирует?
Как можно посмотреть (и изменить, возможно) значение системного генератора, например, RDB$CONSTRAINT_NAME?