我正在遵循本指南使用 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();
我想知道如何解决这个问题。
从此线程中得到答案。 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;
$$;```