Supabase 触发器未被调用

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

我正在遵循本指南使用 Flutter 构建用户管理应用程序并且我位于存储管理部分,但即使在启用 http 扩展并在 SQL 编辑器中定义 SQL 函数以在新的已上传,没有任何反应。旧的头像保留下来,并在存储桶中创建一个新的头像。我没有看到任何错误日志,并且不确定我的设置是否正确。我还运行了每个函数至少一次,但它们都返回了成功。这些是功能:

删除存储对象

create or replace function delete_storage_object(bucket text, object text, out status int, out content text)
returns record
language 'plpgsql'
security definer
as $$
declare
  project_url text := '<YOURPROJECTURL>';
  service_role_key text := '<YOURSERVICEROLEKEY>'; --  full access needed
  url text := project_url||'/storage/v1/object/'||bucket||'/'||object;
begin
  select
      into status, content
           result.status::int, result.content::text
      FROM extensions.http((
    'DELETE',
    url,
    ARRAY[extensions.http_header('authorization','Bearer '||service_role_key)],
    NULL,
    NULL)::extensions.http_request) as result;
end;
$$;

删除头像

    create or replace function delete_avatar(avatar_url text, out status int, out content text)
    returns record
    language 'plpgsql'
    security definer
    as $$
    begin
      select
          into status, content
               result.status, result.content
          from public.delete_storage_object('avatars', avatar_url) as result;
    end;
    $$;

create or replace function delete_old_avatar()
returns trigger
language 'plpgsql'
security definer
as $$
declare
  status int;
  content text;
  avatar_name text;
begin
  if coalesce(old.avatar_url, '') <> ''
      and (tg_op = 'DELETE' or (old.avatar_url <> coalesce(new.avatar_url, ''))) then
    -- extract avatar name
    avatar_name := old.avatar_url;
    select
      into status, content
      result.status, result.content
      from public.delete_avatar(avatar_name) as result;
    if status <> 200 then
      raise warning 'Could not delete avatar: % %', status, content;
    end if;
  end if;
  if tg_op = 'DELETE' then
    return old;
  end if;
  return new;
end;
$$;

create trigger before_profile_changes
  before update of avatar_url or delete on public.profiles
  for each row execute function public.delete_old_avatar();

我想知道如何解决这个问题。

postgresql flutter supabase supabase-flutter
1个回答
0
投票

从此线程中得到答案。 https://github.com/orgs/supabase/discussions/17503

请使用以下代码片段修改触发器delete_old_avatar。

CREATE OR REPLACE FUNCTION delete_old_avatar()
RETURNS TRIGGER
LANGUAGE 'plpgsql'
SECURITY DEFINER
AS $$
DECLARE
    -- Declare variables
    status INT;
    content TEXT;
    avatar_name TEXT;

BEGIN
    -- Check if the old avatar URL is not empty and if the operation is DELETE or avatar URL changed
    IF COALESCE(old.avatar_url, '') <> ''
       AND (tg_op = 'DELETE' OR (old.avatar_url <> new.avatar_url)) THEN

        -- Extract the avatar name from the old avatar URL
        avatar_name := old.avatar_url;

        -- Call the public.delete_avatar function and store the result
        SELECT INTO status, content
               result.status, result.content
        FROM public.delete_avatar(avatar_name) AS result;

        -- Raise a warning if the status is not 200 (OK)
        IF status <> 200 THEN
            RAISE WARNING 'Could not delete avatar: % %', status, content;
        END IF;
    END IF;

    -- Return the old record for DELETE operations
    IF tg_op = 'DELETE' THEN
        RETURN old;
    END IF;

    -- Return the new record for other operations
    RETURN new;

END;
$$;```
© www.soinside.com 2019 - 2024. All rights reserved.