2014-05-14 3 views
2

Когда я изменяю триггер с использованием редактора SQL FlameRobin, изменения не влияют на другие сеансы/соединения: триггер по-прежнему выполняет старую версию.Firebird: Почему ALTER TRIGGER не влияет на другие сеансы/соединения?

Как это возможно? Как заставить изменения повлиять на все подключения?

Я звоню COMMIT после ALTER TRIGGER, и нет другой транзакции в другом соединении. Это не связано с транзакциями, а связано с сеансом/соединением.

«Другие соединения» - это приложения Delphi (с использованием компонентов InterBase), но то же самое поведение можно воспроизвести с использованием двух экземпляров FlameRobin.

Я использую:

  • Firebird 2.5.2 (SuperClassic)
  • FlameRobin 0.9.3
  • Delphi xe5 Update2

ответ

3

В Firebird DDL является транзакционной, поэтому сделка что началось до ваша транзакция изменила базу данных, будет видеть состояние базы данных, как было до того, как ваша транзакция выполнила свою работу, только после транзакции базы данных, она сможет увидеть ваши изменения.

К тому же есть кеш метаданных. В классической и суперклассической модели каждое соединение имеет свои собственные кеши (вместо общего кэша), и этот кеш-кеш не сразу отменяется (я не знаю точных данных). Это означает, что операторы, которые были подготовлены в транзакции до изменения, будут работать так, как если бы база данных не была изменена (это работает, если изменение не изменило основную таблицу), в то время как новые подготовленные заявления будут работать с изменениями.

Хотя DDL возможен, когда база данных используется, я предлагаю сделать это с использованием автономной сети/одиночного пользователя или заставить пользователей повторно подключиться после выполнения DDL, чтобы убедиться, что все подключения видны и используют новые изменения ,

0

Как и Марк Роттевель, вам следует перезапустить все после каждого изменения. Или у вас есть лучший выбор: переключитесь на SuperServer, у которого также меньше ошибок и утечек памяти, чем SuperClassic. SuperClassic - это дерьмо.

Смежные вопросы