我编写了一个返回触发器的PL / PGSQL函数,所以我可以在每行插入之前调用它。我现在意识到我还希望该函数返回新插入行的ID。我不太清楚如何继续,因为我的函数必须返回一个触发器。这是一些代码:
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()
的返回类型保留为TRIGGER
,但我还希望返回subj_album_id
中的值,对应于id
新插入的行。
有没有这样做?它甚至可能吗?显然,改变返回类型并不适用于Postgres。如果有的话,你能建议一种替代方法吗?
答案 0 :(得分:1)
关键问题: 返回ID?
假设您想直接从INSERT
语句返回它,那么您几乎就在那里。您已将新生成的ID分配给函数参数:
...
RETURNING id INTO subj_album_id;
而是将其分配给触发触发器的行的列。 special variable NEW
将此行保存在触发器函数中:
...
RETURNING id INTO NEW.album_id; -- use actual column name in view
然后使用RETURNING
语句的INSERT
子句:
INSERT INTO v_albums (user_id, format_id, location_id, rating)
VALUES ( ... )
RETURNING album_id;
显然,只有在视图中 是可见列时才可以这样做。但是,它不必在INSERT
命令中分配。 NEW
行变量的类型由视图的定义定义,而不是由手头的INSERT
定义。
密切相关的问题:
对于似乎要执行的操作(将某些表的某些行的访问权限授予某个角色)即将发布的Postgres中的新行级别安全性( RLS ) 9.5可能是一个更方便的选择。