我得到了要在 ( BEFORE UPDATE
) 触发器中设置的列的名称,我想将其设置为该OLD
值并忽略传入的任何内容。我尝试了以下操作:
CREATE OR REPLACE FUNCTION prevent_column_update() RETURNS TRIGGER AS $$
DECLARE
col TEXT := TG_ARGV[0];
BEGIN
EXECUTE format('SELECT ($1).%I INTO ($2).%I', col, col) USING OLD, NEW;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
并使用如下:
CREATE TRIGGER request_protect_date_price_value
BEFORE UPDATE OF date_price ON requests
FOR EACH ROW EXECUTE PROCEDURE prevent_column_update('date_price');
Run Code Online (Sandbox Code Playgroud)
但是当更新它失败时:
ERROR: syntax error at or near "("
LINE 1: SELECT ($1).date_price INTO ($2).date_price
^
QUERY: SELECT ($1).date_price INTO ($2).date_price
Run Code Online (Sandbox Code Playgroud) 我有一个以以下结尾的函数:
INSERT INTO configuration_dates (
cols...
) VALUES (
values...
) RETURNING id INTO ret_id;
RETURN ret_id;
Run Code Online (Sandbox Code Playgroud)
我想删除该INTO ret_id
部分,而是执行以下操作:
RETURN (INSERT INTO configuration_dates (
weekly_date_configuration_id,
"from",
"to",
price,
activity_configuration_id
) VALUES (
wdc_id,
from_ts,
from_ts + wdc.duration,
wdc.price,
wdc.activity_configuration_id
) RETURNING id);
Run Code Online (Sandbox Code Playgroud)
但我还没有找到如何实现这一点。
编辑:添加整个功能
CREATE FUNCTION make_date_from_configuration(wdc_id UUID, from_date DATE)
RETURNS INTEGER AS $$
DECLARE
from_dow INT := EXTRACT(isodow FROM from_date); -- day of the week (1 - 7)
wdc weekly_date_configurations;
from_ts TIMESTAMP;
ret_id INTEGER;
BEGIN
SELECT * …
Run Code Online (Sandbox Code Playgroud)