PostgreSQL
คำสั่งที่มีค่าในรูปแบบ <...> เป็น placeholder ให้แทนด้วยค่าจริงก่อนนำไปรัน
-- สร้าง userCREATE USER <username> WITH PASSWORD '<password>';
-- ลบ userDROP USER <username>;
-- เปลี่ยนรหัสผ่านALTER USER <username> WITH PASSWORD '<new_password>';CREATE ROLE <readonly_role>;GRANT USAGE ON SCHEMA public TO <readonly_role>;GRANT SELECT ON ALL TABLES IN SCHEMA public TO <readonly_role>;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO <readonly_role>;
CREATE USER <username> WITH PASSWORD '<password>';
GRANT <readonly_role> TO <username>;Role Types
Section titled “Role Types”-- Read Only RoleCREATE ROLE <readonly_role>;
DROP ROLE <role_name>;
GRANT CONNECT ON DATABASE <database> TO <readonly_role>;-- รันภายใต้การ connect database เท่านั้นGRANT USAGE ON SCHEMA public TO <readonly_role>;GRANT SELECT ON ALL TABLES IN SCHEMA public TO <readonly_role>;
-- Read/Write RoleCREATE ROLE <readwrite_role>;GRANT CONNECT ON DATABASE <database> TO <readwrite_role>;GRANT USAGE ON SCHEMA public TO <readwrite_role>;GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO <readwrite_role>;
-- Admin RoleCREATE ROLE <admin_role> WITH SUPERUSER CREATEDB CREATEROLE;
GRANT <readonly_role> TO <username>;Grant / Revoke Privileges
Section titled “Grant / Revoke Privileges”-- ให้สิทธิ์ connect เข้า databaseGRANT CONNECT ON DATABASE <database> TO <username>;
-- ให้สิทธิ์ใช้งาน schemaGRANT USAGE ON SCHEMA public TO <username>;
-- ให้สิทธิ์อ่านตารางทั้งหมดใน schemaGRANT SELECT ON ALL TABLES IN SCHEMA public TO <username>;
-- ให้สิทธิ์แก้ไขตารางทั้งหมด (อ่าน/เขียน)GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO <username>;
-- ยกเลิกสิทธิ์REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM <username>;Default Privileges
Section titled “Default Privileges”-- กำหนด default privileges สำหรับ object ที่จะถูกสร้างใหม่ใน schema public-- ให้ role <readonly_role> มีสิทธิ์ SELECT (อ่านข้อมูลได้) บน TABLES ที่สร้างใหม่โดยอัตโนมัติALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO <readonly_role>;
SELECT n.nspname AS schema, r.rolname AS grantor, d.defaclobjtype AS object_type, d.defaclacl AS privilegesFROM pg_default_acl dJOIN pg_roles r ON r.oid = d.defaclroleLEFT JOIN pg_namespace n ON n.oid = d.defaclnamespace;
-- กำหนด default privileges สำหรับ object ที่จะถูกสร้างใหม่ใน schema public-- ให้ role <readwrite_role> มีสิทธิ์ SELECT, INSERT, UPDATE, DELETE (อ่าน/เขียน/แก้ไข/ลบ)-- บน TABLES ที่สร้างใหม่โดยอัตโนมัติALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO <readwrite_role>;Useful
Section titled “Useful”-- ดู users ทั้งหมด\duSELECT rolname, rolsuper, rolcreatedb, rolcreaterole, rolreplication, rolcanloginFROM pg_roles;
-- ดู สิทธิในตาราง\dpSELECT n.nspname AS schema, c.relname AS name, c.relkind AS type, c.relacl, pg_catalog.array_to_string(c.relacl, E'\n') AS access_privilegesFROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespaceWHERE c.relkind IN ('r','v','m','S','f','p') -- r = table, v = view, S = sequence ฯลฯ AND n.nspname NOT IN ('pg_catalog', 'information_schema')ORDER BY n.nspname, c.relname;
-- ดูสิทธิ์ในตาราง\z\z <table_name>
SELECT rolname, rolsuper, rolcreatedb, rolcreaterole, rolreplication, rolcanloginFROM pg_roles;
SELECT r.rolname, r.rolsuper, r.rolinherit, r.rolcreaterole, r.rolcreatedb, r.rolcanlogin, r.rolreplication, ARRAY( SELECT b.rolname FROM pg_auth_members m JOIN pg_roles b ON (m.roleid = b.oid) WHERE m.member = r.oid ) AS memberofFROM pg_roles rORDER BY r.rolname;
-- เปลี่ยนเจ้าของตาราง/DBALTER TABLE <table_name> OWNER TO <username>;ALTER DATABASE <database> OWNER TO <username>;Workaround: สร้าง User และกำหนดสิทธิ์ Database
Section titled “Workaround: สร้าง User และกำหนดสิทธิ์ Database”ตัวอย่างขั้นตอนสำหรับสร้าง user ให้ application ใช้งาน database โดยแทน placeholder ใน <...> ให้เป็นค่าจริงก่อนรัน SQL (เช่น <database> เป็น my_database) คำสั่งสร้าง user และ role ให้รันด้วย account ที่มีสิทธิ์จัดการ role
Full access (อ่าน/เขียน)
Section titled “Full access (อ่าน/เขียน)”1. สร้าง role และ user แล้วอนุญาตให้เชื่อมต่อ database
Section titled “1. สร้าง role และ user แล้วอนุญาตให้เชื่อมต่อ database”-- สร้าง role สำหรับสิทธิ์อ่านและเขียนCREATE ROLE <app_full_role> NOLOGIN;
-- สร้าง user สำหรับ applicationCREATE USER <app_user> WITH PASSWORD '<app_password>';
-- ให้ user รับสิทธิ์จาก role แบบ full accessGRANT <app_full_role> TO <app_user>;
-- อนุญาตให้เชื่อมต่อ databaseGRANT CONNECT ON DATABASE <database> TO <app_full_role>;2. เชื่อมต่อเข้า database แล้วกำหนดสิทธิ์ใน schema public
Section titled “2. เชื่อมต่อเข้า database แล้วกำหนดสิทธิ์ใน schema public”-- อนุญาตให้ใช้งาน schemaGRANT USAGE ON SCHEMA public TO <app_full_role>;
-- ให้สิทธิ์อ่าน เพิ่ม แก้ไข และลบข้อมูลในตารางที่มีอยู่GRANT SELECT, INSERT, UPDATE, DELETEON ALL TABLES IN SCHEMA publicTO <app_full_role>;
-- ให้สิทธิ์ใช้งาน sequence ที่มีอยู่ เช่น sequence ของ SERIALGRANT USAGE, SELECTON ALL SEQUENCES IN SCHEMA publicTO <app_full_role>;
-- ให้สิทธิ์กับตารางที่สร้างใหม่โดย object ownerALTER DEFAULT PRIVILEGES IN SCHEMA publicGRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO <app_full_role>;
-- ให้สิทธิ์กับ sequence ที่สร้างใหม่โดย object ownerALTER DEFAULT PRIVILEGES IN SCHEMA publicGRANT USAGE, SELECT ON SEQUENCES TO <app_full_role>;ถ้าต้องการให้ migration role สร้าง table หรือ object ใหม่ใน schema public ให้เพิ่มสิทธิ์นี้:
-- อนุญาตให้ migration role ใช้งาน schema และสร้าง object ใหม่GRANT USAGE, CREATE ON SCHEMA public TO <migration_role>; สิทธิ์ CREATE บน schema ใช้สร้าง table ได้ แต่ PostgreSQL ไม่มี privilege แยกสำหรับ DROP table; การ DROP ต้องมี ownership ของ table นั้น หาก migration ต้องลบ table ที่สร้างโดย role อื่น ให้รัน migration ในฐานะ owner หรือ SET ROLE เป็น <table_owner> ก่อน
Read-only
Section titled “Read-only”1. สร้าง role และ user แล้วอนุญาตให้เชื่อมต่อ database
Section titled “1. สร้าง role และ user แล้วอนุญาตให้เชื่อมต่อ database”-- สร้าง role สำหรับอ่านข้อมูลเท่านั้นCREATE ROLE <reader_role> NOLOGIN;
-- สร้าง user สำหรับการอ่านข้อมูลCREATE USER <reader_user> WITH PASSWORD '<reader_password>';
-- ให้ user รับสิทธิ์จาก role แบบ read-onlyGRANT <reader_role> TO <reader_user>;
-- อนุญาตให้เชื่อมต่อ databaseGRANT CONNECT ON DATABASE <database> TO <reader_role>;2. เชื่อมต่อเข้า database แล้วกำหนดสิทธิ์อ่านใน schema public
Section titled “2. เชื่อมต่อเข้า database แล้วกำหนดสิทธิ์อ่านใน schema public”-- อนุญาตให้ใช้งาน schemaGRANT USAGE ON SCHEMA public TO <reader_role>;
-- ให้สิทธิ์อ่านตารางและ view ที่มีอยู่GRANT SELECT ON ALL TABLES IN SCHEMA public TO <reader_role>;
-- ให้สิทธิ์อ่านตารางและ view ที่สร้างใหม่โดย object ownerALTER DEFAULT PRIVILEGES IN SCHEMA publicGRANT SELECT ON TABLES TO <reader_role>; ALTER DEFAULT PRIVILEGES มีผลเฉพาะ object ที่สร้างโดย role ซึ่งรันคำสั่งนี้ หากมีหลาย role เป็นผู้สร้างตาราง ให้รันคำสั่ง ALTER DEFAULT PRIVILEGES FOR ROLE ... แยกตามแต่ละ owner