我有一个触发器,可以检测字段 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
答案 0 :(得分:5)
AFAIK,你不能传递参数,但你可以通过以下想法得到你想要的东西:
示例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)
您可以按如下方式使用它:
例:
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
要捕获已保存的信息,请使用:
Select rdb$get_context('USER_SESSION', 'REGISTRO') from rdb$database;
答案 2 :(得分:0)
这是不可能的。该事件只是一个名称,如果添加id或其他限定符,它只会变成另一个事件,因为它具有不同的名称。订阅活动时,您只能按名称订阅,不能使用通配符,并且不能包含参数。
事件是简单而便宜的通知,Firebird甚至可以合并多个帖子&#39;将同一事件放入到客户端的单个通知中,因此不支持参数或值。
基本思想是客户订阅事件,然后确定改变了什么以及需要做出什么反应。你可以帮助&#39;客户端 - 例如 - 填充一个便宜的查询支持表。
另外请考虑阅读文章"The Power of Firebird Events",它有点陈旧,但由于Firebird事件没有太大变化,因此很多情况仍然适用。