PLPGSQL 函数返回触发器和值

PLPGSQL function returning trigger AND value

我写了一个 PL/PGSQL 函数,它 return 是一个触发器,所以我可以在每行插入之前调用它。我现在意识到我还希望该函数 return 新插入行的 ID。我不太确定如何继续,因为我的函数必须 return 一个触发器。这是一些代码:

CREATE OR REPLACE FUNCTION f_insert_album() RETURNS TRIGGER AS $$
DECLARE
    subj_album_id INTEGER;
BEGIN
    -- ... some parts where left out
    INSERT INTO t_albums_subjective (user_id, album_id, format_id, location_id, rating) 
    VALUES (NEW.user_id, obj_album_id, NEW.format_id, NEW.location_id, NEW.rating) 
    RETURNING id INTO subj_album_id;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- Bind insert function to trigger
DROP TRIGGER IF EXISTS tr_v_albums_insert ON v_albums; 
CREATE TRIGGER tr_v_albums_insert INSTEAD OF INSERT ON v_albums
    FOR EACH ROW EXECUTE PROCEDURE f_insert_album();

我必须将函数 f_insert_album() 的 return 类型保留为 TRIGGER,但我真的很想 return subj_album_id 中的值,对应新插入行的id

有办法吗?有可能吗?显然更改 return 类型不适用于 Postgres。如果有的话,你能推荐一个替代方法吗?

关键问题:哪里到return的ID?

假设您想直接从 INSERT 语句中 return 它,那么您就快完成了。您已经将新生成的 ID 分配给函数参数:

...
RETURNING id INTO subj_album_id;

相反,将其分配给触发触发器的行的列。 special variable NEW 将此行保存在触发器函数中:

...
RETURNING id INTO NEW.album_id;  -- use actual column name in view

然后使用INSERT语句的RETURNING子句:

INSERT INTO v_albums (user_id, format_id, location_id, rating) 
VALUES ( ... ) 
RETURNING album_id;

显然,这只有在视图中有 可见列时才有可能。不过,它不必在 INSERT 命令中指定。 NEW行变量的类型由视图的定义定义,而不是由手头的INSERT定义。

密切相关:


对于您似乎正在做的事情(将对table的某些行的访问权限授予特定角色)行级安全性(RLS ) 在 Postgres 9.5 或更高版本中可能是更方便的选择: