နားလည်ထားရမယ့် အချက်
PostgreSQL မှာ user နှင့် group နှစ်မျိုးလုံးကို role concept တစ်ခုတည်းဖြင့်စီမံပါတယ်။ Application runtime role ကို schema owner/superuser မဖြစ်စေဘဲ လိုသော CONNECT၊ USAGE၊ SELECT/INSERT/UPDATE သာပေးရပါတယ်။ Row-Level Security (RLS) က query ထဲ WHERE မေ့သွားလည်း row ownership policy ကို database မှာ enforce နိုင်ပေမယ့် owner/bypass behavior ကိုနားလည်ရပါတယ်။
လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
Migration role က DDL ကိုပိုင်ပြီး app runtime role က DML သာလုပ်နိုင်အောင်ခွဲမယ်။ Progress table တွင် session setting ထဲက current user ID နဲ့ကိုက်သော rows သာဖတ်/ပြင်ခွင့်ရှိသည့် RLS policy နမူနာထည့်မယ်။
အတူတူ စမ်းရေးကြည့်မယ်
CREATE ROLE tutorial_app LOGIN PASSWORD 'replace-me';
GRANT CONNECT ON DATABASE tutorial_platform TO tutorial_app;
GRANT USAGE ON SCHEMA app TO tutorial_app;
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA app TO tutorial_app;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA app TO tutorial_app;
ALTER TABLE app.lesson_progress ENABLE ROW LEVEL SECURITY;
CREATE POLICY progress_by_user ON app.lesson_progress
USING (EXISTS (
SELECT 1 FROM app.enrollments e
WHERE e.enrollment_id = lesson_progress.enrollment_id
AND e.user_id = current_setting('app.user_id', true)::bigint
))
WITH CHECK (EXISTS (
SELECT 1 FROM app.enrollments e
WHERE e.enrollment_id = lesson_progress.enrollment_id
AND e.user_id = current_setting('app.user_id', true)::bigint
));App role က သတ်မှတ်ထားသော objects/actions နှင့် permitted rows သာအသုံးပြုနိုင်မည်။၅ မိနစ် စမ်းကြည့်
Read-only reporting role တစ်ခုဖန်တီးပြီး `app` schema table များကို SELECT သာပေးပါ။
သတိလေးတစ်ချက်
နမူနာ password ကိုမသုံးပါနှင့်။ `ALTER DEFAULT PRIVILEGES` မသတ်မှတ်လျှင် နောက်ဖန်တီးသည့် tables သို့ grants မရောက်နိုင်ပါ။
PostgreSQL — Database Roles — PostgreSQL Global Development Group