Granting and Revoking Privileges

1. Granting Table Privileges

GRANT SELECT, INSERT, UPDATE, DELETE ON orders TO app_writer;
PrivilegeEffect
SELECTRead rows
INSERT/UPDATE/DELETEDML
TRUNCATETruncate table
REFERENCESCreate FK referencing table
TRIGGERCreate trigger on table

2. Granting Column-Level Privileges

GRANT SELECT (id, email) ON customers TO support;
GRANT UPDATE (status) ON orders TO ops;

3. Granting ALL Privileges

GRANT ALL PRIVILEGES ON orders TO owner_role;

4. Granting on All Tables

GRANT SELECT ON ALL TABLES    IN SCHEMA public TO app_reader;
GRANT USAGE  ON ALL SEQUENCES IN SCHEMA public TO app_writer;

5. Revoking Privileges

REVOKE INSERT ON orders FROM app_writer;
REVOKE ALL ON SCHEMA public FROM PUBLIC;

6. Granting Schema Privileges

GRANT USAGE, CREATE ON SCHEMA app TO app_writer;

7. Granting Database Privileges

GRANT CONNECT, TEMP, CREATE ON DATABASE shop TO app_writer;

8. Granting Function Privileges

GRANT EXECUTE ON FUNCTION transfer(int,int,numeric) TO app_writer;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA api TO app_writer;

9. Granting Sequence Privileges

GRANT USAGE, SELECT, UPDATE ON SEQUENCE orders_id_seq TO app_writer;

10. Using WITH GRANT OPTION

GRANT SELECT ON customers TO support WITH GRANT OPTION;

11. Revoking with CASCADE

REVOKE SELECT ON customers FROM support CASCADE;
-- also revokes from anyone support granted to

12. Setting Default Privileges

ALTER DEFAULT PRIVILEGES IN SCHEMA app
   GRANT SELECT ON TABLES TO app_reader;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app
   GRANT USAGE ON SEQUENCES TO app_writer;
Note: Only affects objects created AFTER the statement runs.

13. Checking Privileges

SELECT has_table_privilege('alice', 'orders', 'SELECT');
\dp orders
SELECT grantee, privilege_type FROM information_schema.role_table_grants
 WHERE table_name='orders';