检查触发函数中是否存在id并采取相应行动

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

在触发器函数中,我想从表中选择一个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

postgresql triggers plpgsql supabase-database
1个回答
0
投票

你想要类似的东西:

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
来简化:

根据您在函数中执行的其他操作,可能存在潜在的竞争条件。参见:

相关说明,请注意死锁。参见:

或者也许您根本不需要触发器?

并阅读手册中的有关触发功能的基础知识,正如评论中所建议的那样。

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