Kalau kamu mau ringkas dan maintainable, cukup simpan 1 fungsi ini saja π
-- ============================================================
-- π FUNGSI: Mengecek apakah user punya salah satu dari banyak role
-- ============================================================
create or replace function public.has_any_role(uid uuid, roles text[])
returns boolean
language sql
security definer
as $$
select exists (
select 1
from public.profiles
where id = uid
and role = any(roles)
limit 1
);
$$;
-- Izin eksekusi
grant execute on function public.has_any_role(uuid, text[]) to authenticated;
grant execute on function public.has_any_role(uuid, text[]) to anon;
USING (has_any_role(auth.uid(), array['admin']));
USING (has_any_role(auth.uid(), array['admin', 'kasir']));
USING (
has_any_role(auth.uid(), array['admin'])
OR created_by = auth.uid()
);
Jadi jawabannya:
π₯ Cukup has_any_role() saja.
has_role()boleh dihapus (tidak wajib, hanya versi βpendekβ dari fungsi yang sama).
Kalau mau, aku bisa bantu buatkan versi has_any_role() + contoh lengkap 4 policy (SELECT, INSERT, UPDATE, DELETE) untuk admin dan kasir β agar kamu tinggal tempel di Supabase. Mau sekalian?
Mantap πͺ ini dia β versi lengkap & siap tempel di Supabase SQL Editor, hanya pakai 1 fungsi (has_any_role) dan langsung dilengkapi 4 RLS policy (SELECT, INSERT, UPDATE, DELETE).
Role yang diizinkan: admin dan kasir.
Selain itu, user hanya boleh mengelola data miliknya sendiri (misalnya di kolom created_by).