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

问题描述 投票:1回答:2

我在数据库中有树表: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表上定义),以便可以执行另一个自动插入?或者你能建议任何其他解决方案?

postgresql triggers
2个回答
1
投票

首先@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;

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.