Session 为什么ALTER触发器对其他会话/连接没有影响?

Session 为什么ALTER触发器对其他会话/连接没有影响?,session,triggers,database-connection,firebird,flamerobin,Session,Triggers,Database Connection,Firebird,Flamerobin,使用FlameRobin SQL编辑器修改触发器时,更改对其他会话/连接没有影响:触发器仍在执行旧版本 这怎么可能?如何强制更改以影响所有连接 我在ALTER TRIGGER之后调用COMMIT,并且在另一个连接中也没有打开的事务。这与事务无关,但与会话/连接相关 “其他连接”是Delphi应用程序(使用InterBase组件),但使用FlameRobin的两个实例可以复制完全相同的行为 我正在使用: 火鸟2.5.2(超经典) 0.9.3 Delphi XE5更新2 Firebird DDL中

使用FlameRobin SQL编辑器修改触发器时,更改对其他会话/连接没有影响:触发器仍在执行旧版本

这怎么可能?如何强制更改以影响所有连接

我在
ALTER TRIGGER
之后调用
COMMIT
,并且在另一个连接中也没有打开的事务。这与事务无关,但与会话/连接相关

“其他连接”是Delphi应用程序(使用InterBase组件),但使用FlameRobin的两个实例可以复制完全相同的行为

我正在使用:

  • 火鸟2.5.2(超经典)
  • 0.9.3
  • Delphi XE5更新2

Firebird DDL中的事务是事务性的,因此在您的事务更改数据库之前启动的事务将看到数据库的状态,就像您的事务执行其工作之前一样,只有在提交数据库的事务之后,它才能看到您的更改

除此之外,还有一个元数据缓存。在经典和超经典模型中,每个连接都有自己的缓存(而不是共享缓存),并且每个连接的缓存不会立即失效(尽管我不知道确切的细节)。这意味着,在更改之前在事务中准备的语句将像数据库没有更改一样工作(除非更改从根本上改变了表,否则这是有效的),而新准备的语句将与更改一起工作


虽然在使用数据库时可以使用DDL,但我建议在数据库脱机/单用户时使用DDL,或者在执行DDL后强制用户重新连接,以确保所有连接都能看到并使用新的更改。

就像Mark Rotteveel建议的那样,每次更改后都必须重新启动所有操作。或者你有更好的选择:切换到SuperServer,它也比SuperClassic有更少的bug和内存泄漏。超经典是垃圾