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 或更高版本中可能是更方便的选择:
我写了一个 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 或更高版本中可能是更方便的选择: