gpt4 book ai didi

postgresql - postgresql 中的更新语句后未触发规则

转载 作者:行者123 更新时间:2023-11-29 12:01:15 25 4
gpt4 key购买 nike

按照 www.postgresql.org 中的指南进行操作

我创建了这个语句:

CREATE TABLE shoelace_log (
sl_name text, -- shoelace changed
sl_avail integer, -- new available value
log_who text, -- who did it
log_when timestamp -- when);
CREATE RULE log_shoelace AS ON UPDATE TO shoelace_data
WHERE NEW.sl_avail <> OLD.sl_avail
DO INSERT INTO shoelace_log VALUES (
NEW.sl_name,
NEW.sl_avail,
current_user,
current_timestamp
);

当我尝试在 pgAdmin3 查询控制台中执行查询时:

UPDATE shoelace_data SET sl_avail = 6 WHERE sl_name = 'sl7';

只执行更新查询,不触发规则。我尝试使用 EXPLAIN 命令来理解原因。

EXPLAIN UPDATE shoelace_log SET sl_avail = 6 WHERE sl_name = 'sl7';

日志说:

"Seq Scan on shoelace_log  (cost=0.00..19.66 rows=4 width=32)"
" Filter: (sl_name = 'sl7'::text)"
"Seq Scan on shoelace_log (cost=0.00..19.62 rows=4 width=78)"
" Filter: (sl_name = 'sl7'::text)"

我也尝试在 EXPLAIN 中使用 VERBOSE 选项,但我不明白为什么我的事件没有被触发。

最佳答案

您选择了错误的功能。完全忘记规则——它们很难,几乎不可能正确地做。

这里你需要的是一个触发器:

create or replace function shoelace_log_who_when()
returns trigger language plpgsql as
$$
begin
if OLD.sl_avail is distinct from NEW.sl_avail then
NEW.log_who = current_user;
NEW.log_when = current_timestamp;
end if;
return NEW;
end;
$$;

create trigger shoelace_log_who_when before update on shoelace_log
for each row execute procedure shoelace_log_who_when();

试一试:

insert into shoelace_log values ( 'foo', 1, NULL, NULL );select * from shoelace_log;
sl_name | sl_avail | log_who | log_when ---------+----------+---------+----------foo     |        1 |         | 
update shoelace_log set sl_avail=2;select * from shoelace_log;
 sl_name | sl_avail | log_who  |         log_when          ---------+----------+----------+--------------------------- foo     |        2 | tometzky | 2011-03-30 17:06:21.07137

关于postgresql - postgresql 中的更新语句后未触发规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5487796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com