PostgreSQL - 如何将函数的参数传递给触发器?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostgreSQL - 如何将函数的参数传递给触发器?相关的知识,希望对你有一定的参考价值。

我在数据库中有树表:users(user_id(自动增量),fname,lname),角色(role_id,role_desc)和users_roles(user_id,role_id)。我想做的是拥有一个create_user_with_role函数。该函数有3个参数:名字,姓氏和role_id。该函数在users表中插入一个新行,并自动创建一个新的user_id。现在我想在users_roles表中插入一条新记录:user_id是新创建的值,role_id是从函数的参数列表中获取的。是否可以将role_id参数传递给后插入触发器(在users表上定义),以便可以执行另一个自动插入?或者你能建议任何其他解决方案?

答案

首先@Pavel Stehule是对的:

永远不要试图将参数传递给触发器!

其次,你只需要将插入的id变成一个变量。

CREATE FUNCTION create_user_with_role(first_name text, last_name text, new_role_id integer)
RETURNS VOID AS $$
DECLARE
    new_user_id integer;
BEGIN
    INSERT INTO users (fname, lname) VALUES (first_name, last_name)
        RETURNING id INTO new_user_id;
    INSERT INTO users_roles (user_id, role_id)
        VALUES (new_user_id, new_role_id);
END;$$ LANGUAGE plpgsql;

显然,如果你想插入多行,这是完全低效的,但这是另一个问题;)

另一答案

当你需要传递任何参数来触发时,那么就是干净的,所以你的设计是错误的。通常触发器应具有检查或审核功能。不多。您可以使用函数,并直接从您的应用程序调用函数。永远不要试图将参数传递给触发器!另一个不好的标志是表中的人工列仅用于触发参数化。这是非常糟糕的设计!

以上是关于PostgreSQL - 如何将函数的参数传递给触发器?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 POST 参数传递给 Durable Function,然后将此参数传递给 Timer Triggered 函数

如何将参数传递给快速完成的函数

Prettyphoto - 如何将唯一参数传递给回调函数

如何将参数传递给使用 ...mapActions(...) 映射的函数?

如何将参数传递给静态类构造函数?

如何将参数传递给使用 setTimeout 调用的函数?