在触发器函数中,我想从表中选择一个id。如果这个id存在,我想用它做点什么,如果不存在,我想用它做点别的事情。
我的代码:
CREATE OR REPLACE FUNCTION public.handle_new_user()
RETURNS TRIGGER
LANGUAGE plpgsql
SECURITY DEFINER
AS
$function$
DECLARE
_organisation_id INT;
BEGIN
SELECT id FROM public.organisation WHERE $CONDITION
RETURNING id
INTO _organisation_id;
// check if _organisation_id is set
RETURN new;
END;
$function$
我可以将 id 存储到
_organisation_id
中吗?如果没有 id 会怎样?声明为INT
是否正确?或者我是否需要明确声明它可以是 INT
或 Null 或其他什么?
如何检查id是否设置?如何在 PL/pgSQL 中执行此 if/else 结构?
当新用户注册我的supabase项目时,触发函数被调用。这是触发器:
-- trigger the function every time a user is created
create trigger on_auth_user_created
after insert on auth.users
for each row execute procedure public.handle_new_user();
我的
organisation.id
是bigint
。
你想要类似的东西:
CREATE OR REPLACE FUNCTION public.handle_new_user()
RETURNS trigger
LANGUAGE plpgsql AS -- why SECURITY DEFINER ?
$func$
DECLARE
_org_id bigint; -- matching type!
BEGIN
SELECT o.id
FROM public.organisation o
WHERE -- $CONDITION -- condition matters!
INTO _org_id;
IF FOUND THEN
-- do something
ELSE
-- do something else
END IF;
RETURN null; -- irrelevant for AFTER trigger
END
$func$;
SELECT INTO
设置特殊变量FOUND
。
如果你实际上在函数中没有使用
_org_id
,你可以用EXISTS
来简化:
根据您在函数中执行的其他操作,可能存在潜在的竞争条件。参见:
相关说明,请注意死锁。参见:
或者也许您根本不需要触发器?
并阅读手册中的有关触发功能的基础知识,正如评论中所建议的那样。