Events 如何立即执行事件

Events 如何立即执行事件,events,stored-procedures,transactions,firebird,firebird2.5,Events,Stored Procedures,Transactions,Firebird,Firebird2.5,我的数据库中有一个存储过程,它执行一个查询并用结果填充一个表 由于查询结果的循环需要花费大量时间,因此我尝试通过语句发布事件 Firebird中事件的一个(合理)缺点是在事务提交()之前不会执行它们: 事件发布后,订阅该事件的每个客户端都将收到通知。为了实现这一点,Firebird的一个名为事件管理器的单独组件正在后台运行,并维护它们注册接收的应用程序和事件的列表。只有在提交运行触发器或存储过程的事务时,才会将事件发送到事件管理器 但是我正在执行一个耗时的存储过程。因此,我需要立即执行事件 因此

我的数据库中有一个存储过程,它执行一个查询并用结果填充一个表

由于查询结果的循环需要花费大量时间,因此我尝试通过语句发布事件

Firebird中事件的一个(合理)缺点是在事务提交()之前不会执行它们:

事件发布后,订阅该事件的每个客户端都将收到通知。为了实现这一点,Firebird的一个名为事件管理器的单独组件正在后台运行,并维护它们注册接收的应用程序和事件的列表。只有在提交运行触发器或存储过程的事务时,才会将事件发送到事件管理器

<>但是我正在执行一个耗时的存储过程。因此,我需要立即执行事件

因此,我尝试使用发布事件。不幸的是,这没有帮助,因为

自治事务与其父事务具有相同的隔离级别

我的下一个方法是使用with options和实现更大的自主性。为此,我编写了一个存储过程:

CREATE PROCEDURE EXECUTE_STATEMENT_EXTERNAL (
  STATEMENTTEXT TYPE OF DMN_SQLSTATEMENTS)
AS
DECLARE VARIABLE ATTACHMENT_NAME TYPE OF DMN_RDB_ATTACHMENTNAME;
begin
  select MON$ATTACHMENT_NAME
    from mon$attachments
    where MON$ATTACHMENT_ID = CURRENT_CONNECTION
    into :attachment_name;

  execute statement statementtext
    with autonomous transaction                  
    on external '127.0.0.1:' || :attachment_name 
    as user '<my user name>'                     
    password '<my password>';                          
end
创建过程执行\u语句\u外部(
语句DMN的文本类型(SQL语句)
作为
声明DMN\u RDB\u ATTACHMENTNAME的变量ATTACHMENT\u NAME类型;
开始
选择MON$ATTACHMENT\u NAME
来自mon$附件
其中MON$ATTACHMENT\u ID=当前\u连接
分为:附件名称;
执行语句语句文本
具有自主事务
关于外部“127.0.0.1:”| |:附件|名称
作为用户“”
密码“”;
结束
不幸的是,这也不起作用。此外,它显著降低了调用存储过程的速度



那么,在我尝试了这么多之后,是否有任何东西可以让事件立即执行?

有趣的是,我本以为这会奏效。您使用的是SuperServer、Classic还是SuperClassic?我通常使用ClassicServer模式。我建议您也可以咨询Firebird支持或Firebird-devel邮件列表。