2

FlameRobin SQL エディターを使用してトリガーを変更すると、変更は他のセッション/接続に影響を与えません。トリガーはまだ古いバージョンを実行しています。

これはどのように可能ですか?変更を強制的にすべての接続に適用するにはどうすればよいですか?

COMMITの後に呼び出しますALTER TRIGGERが、他の接続にも開いているトランザクションはありません。これはトランザクション関連ではなく、セッション/接続関連です。

「その他の接続」は Delphi アプリケーション(InterBase コンポーネントを使用)ですが、FlameRobin の 2 つのインスタンスを使用してまったく同じ動作を再現できます。

私は使用しています:

  • Firebird 2.5.2 (スーパークラシック)
  • フレイムロビン 0.9.3
  • Delphi XE5 update2
4

2 に答える 2

3

Firebird DDL はトランザクションに対応しているため、トランザクションがデータベースを変更する前に開始されたトランザクションは、トランザクションが作業を行う前のデータベースの状態を確認できます。データベースのトランザクションがコミットされた後にのみ、変更を確認できます。 .

その上に、メタデータ キャッシュがあります。Classic および SuperClassic モデルでは、各接続に (共有キャッシュの代わりに) 独自のキャッシュがあり、この接続ごとのキャッシュはすぐには無効になりません (ただし、正確な詳細はわかりません)。つまり、変更前にトランザクションで準備されたステートメントは、データベースが変更されていないかのように機能し (変更によってテーブルが根本的に変更されない限り、これは機能します)、新しく準備されたステートメントは変更で機能します。

データベースの使用中に DDL は可能ですが、データベースをオフライン/シングル ユーザーで実行するか、DDL の実行後にユーザーに強制的に再接続して、すべての接続で新しい変更が表示され、使用されるようにすることをお勧めします。

于 2014-05-15T08:09:42.213 に答える
0

Mark Rotteveel が提案したように、変更するたびにすべてを再起動する必要があります。または、より適切な選択肢があります。SuperServer に切り替えることもできます。SuperServer は、SuperClassic よりもバグやメモリ リークが少なくなります。スーパークラシックはだめです。

于 2015-09-25T03:47:54.760 に答える