是否可以在firebird事件中使用参数:POST_EVENT'event_name'+ string args?

时间:2010-12-02 17:47:14

标签: events firebird

我有一个触发器,可以检测字段 PHONE_EXT 上的更改并发布事件。我想在活动中发布 Phone_ID ,以便在客户端中使用此ID。这可能吗?怎么样?

CREATE TRIGGER tr2 FOR employee
ACTIVE AFTER UPDATE POSITION 0
AS
BEGIN
    IF (new.PHONE_EXT <> old.PHONE_EXT) THEN
          POST_EVENT 'phone_ext_changed'; <-- I would like to pass a string parameter with record ID
END

3 个答案:

答案 0 :(得分:5)

AFAIK,你不能传递参数,但你可以通过以下想法得到你想要的东西:

  • 如果在您的客户中您对特定记录的事件感兴趣,您可以附加更改记录的ID并发布该事件。客户使用感兴趣的特定ID注册感兴趣的事件。见例1.
  • 如果您的前端对所有更改感兴趣,但您想知道哪些特定记录已更改,则可以将这些记录“标记”为“最近更改”(使用同一记录中的其他字段或详细信息表,例)。在客户端通知和操作后,它会恢复或清除该标志。例如,可以使用辅助表来跟踪特定客户端的丢失记录,这取决于您的需求。

示例1

begin
  if (new.phone_ext <> old.phone_ext) then
    post_event 'phone_ext_changed_'||new.ID;
end

示例2

begin
  if (new.phone_ext <> old.phone_ext) then
  begin
    new.recent_ext_change = 1;
    /* or maybe */
    new.last_ext_change = cast('now' as DateTime);
    /* or maybe */
    insert into changed_phone_ext values (gen_id(some_generator, 1), New.ID, 'now');
    /* finally, post the event */
    post_event 'phone_ext_changed_';
  end
end

我在不同的应用程序/情况下都成功使用它们。

答案 1 :(得分:0)

您可以按如下方式使用它:

  1. 在触发器中设置上下文变量并将所需信息放入其中。
  2. 例:

    Create trigger evento_ai0 for evento
    active after insert position 0
    AS
    BEGIN
     Post_Event 'Evento_inserido';
    

    “创建可变的上下文”

    rdb$set_context('USER_SESSION', 'REGISTRO' , 'Registro inserido: '||new.eve_id);
    END
    
    1. 要捕获已保存的信息,请使用:

      Select rdb$get_context('USER_SESSION', 'REGISTRO') from rdb$database;

答案 2 :(得分:0)

这是不可能的。该事件只是一个名称,如果添加id或其他限定符,它只会变成另一个事件,因为它具有不同的名称。订阅活动时,您只能按名称订阅,不能使用通配符,并且不能包含参数。

事件是简单而便宜的通知,Firebird甚至可以合并多个帖子&#39;将同一事件放入到客户端的单个通知中,因此不支持参数或值。

基本思想是客户订阅事件,然后确定改变了什么以及需要做出什么反应。你可以帮助&#39;客户端 - 例如 - 填充一个便宜的查询支持表。

另外请考虑阅读文章"The Power of Firebird Events",它有点陈旧,但由于Firebird事件没有太大变化,因此很多情况仍然适用。