在Postgresql中,我在一个表上有一个UPDATE规则,只需要调用dctUpdate
函数而不执行整个SQL语句,因为SQL语句实际上是在函数中完成的。我知道调用该函数的唯一方法是通过SELECT dctUpdate(windowId)
:
create or replace function infoUpdate(windowId in numeric) returns void as $$
begin
if windowId is null then
update info_timestamp set timestamp = now();
else
update info_timestamp set timestamp = now() where window_id = windowId;
end if;
end;
$$ LANGUAGE plpgsql;
create or replace rule info_update_rule as on update to some_table do also select infoUpdate(NEW.window_id);
但是,在命令行中,当因为我在some_table
中更新了一行而触发了该规则时,我从调用该函数的SELECT
子句中得到无用的输出:
db=# update some_table set name = 'foobar' where window_id = 1;
infoupdate
-----------
(1 row)
UPDATE 1
有没有办法让info_update_rule
调用infoUpdate
函数而不显示虚拟输出?
答案 0 :(得分:1)
我发现没有选项可以使用规则来实现它,但是有另一种方法来实现这个usign触发器。
因此,您将触发器功能定义如下:
CREATE OR REPLACE FUNCTION ur_wrapper_trg()
RETURNS trigger AS
$BODY$
begin
perform infoUpdate(NEW.window_id);
RETURN NEW;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION ur_wrapper_trg() OWNER TO postgres;
使用注意PERFORM
语法。此语法与SELECT
语法相同,只是它会压缩所有输出。
比定义触发器
CREATE TRIGGER some_table_utrg
BEFORE UPDATE
ON some_table
FOR EACH ROW
EXECUTE PROCEDURE ur_wrapper_trg();
最后,你重新掌握了你的规则。
未使用null
进行测试,但实际windos_id
按预期工作,没有任何不需要的输出。
有关详细说明,请咨询Triggers和Rules vs triggers。
答案 1 :(得分:0)
我所关注的解决方案是在\t \a
之前和之后调用select function()
。唯一剩下的就是为每次通话换一个新线。