PLPGSQL函数返回触发器AND值

时间:2015-11-02 03:23:38

标签: postgresql triggers plpgsql sql-view sql-returning

我编写了一个返回触发器的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。如果有的话,你能建议一种替代方法吗?

1 个答案:

答案 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可能是一个更方便的选择。