检查 plpgsql 中是否存在 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是否设置?如何在 plpgsql 中执行此 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 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.