ROLEs and Permissions in PostgreSQL

Welcome to this comprehensive guide on roles and permissions in PostgreSQL. If you're getting started with PostgreSQL, you're in the right place! Understanding how roles and permissions work is a crucial part of effectively managing your databases. PostgreSQL provides a robust system for managing users and roles, as well as permissions for these roles. This blog post aims to demystify these concepts and provide you with practical knowledge to confidently handle roles and permissions in PostgreSQL.

Introduction to PostgreSQL Roles

PostgreSQL uses a concept called 'roles' to handle client authentication and authorization. A role can represent a database user or a group of database users. You can think of roles as similar to user accounts in other database systems.

Here's an example of creating a new role:

CREATE ROLE mynewrole;

To login with your new role, you will also need to give it a login privilege:


You can also create a role with login privilege in a single command like this:


In case you want to delete the role, you can use the DROP ROLE command:

DROP ROLE mynewrole;

User Roles and Group Roles

PostgreSQL doesn't distinguish between user roles and group roles. A role can have the ability to log in and can have other roles as members. Here's how to create a role that has login ability (a user role):


And here's how you would create a role that doesn't have login ability (typically a group role):


You can add user roles to group roles using the GRANT command:

GRANT staff TO john;

This command makes john a member of staff.

Granting Permissions to Roles

Permissions in PostgreSQL are the rights to perform certain actions on database objects. The three basic permissions are SELECT (read), INSERT (write), and UPDATE (modify).

To grant SELECT permission on a table to a role, you would use the GRANT command like this:

GRANT SELECT ON mytable TO mynewrole;

Similarly, to grant INSERT and UPDATE permissions, you would use:

GRANT INSERT, UPDATE ON mytable TO mynewrole;

Revoking Permissions

Just as you can grant permissions, you can also revoke them using the REVOKE command. Here's how you would revoke SELECT permission from a role:

REVOKE SELECT ON mytable FROM mynewrole;

And here's how you would revoke all permissions:


Permissions at the Database Level

So far, we've been talking about permissions at the table level. You can also grant permissions at the database level. For example, to grant the CONNECT privilege to a role, you would use:

GRANT CONNECT ON DATABASE mydatabase TO mynewrole;

To revoke this privilege, you would use:



Q: Can a PostgreSQL role represent multiple users?

A: Yes, a PostgreSQL role can represent multiple users. You can add user roles as members of a group role, and all members of the group will inherit the permissions of the group.

Q: How do I list all roles in PostgreSQL?

A: You can list all roles using the \du command in the psql command-line clientSure, let's continue.

Q: How do I list all roles in PostgreSQL?

A: You can list all roles using the \du command in the psql command-line client.


This command displays a list of all roles, their options, and their member roles.

Q: Can I grant a role all permissions on a table at once?

A: Yes, you can use the ALL PRIVILEGES keyword to grant all permissions at once.

GRANT ALL PRIVILEGES ON mytable TO mynewrole;

This grants the role mynewrole all permissions on mytable.

Q: How do I remove a role from a group?

A: You can remove a role from a group using the REVOKE command:

REVOKE staff FROM john;

This command removes john from the staff group.

Q: How can I check what permissions a role has on a table?

A: You can check the permissions a role has on a table by querying the pg_class and pg_roles system catalogs. Here's an example:

SELECT grantee, privilege_type FROM information_schema.role_table_grants WHERE table_name='mytable';

This query displays the roles and their permissions on the table mytable.

Q: What happens if I drop a role that still has permissions on a table?

A: If you drop a role, PostgreSQL will automatically revoke all permissions that role had on any tables.

Q: Can a role have permissions on a database and not on specific tables within that database?

A: Yes, a role can have permissions at the database level and not at the table level. For example, you can grant the CONNECT privilege to a role without granting it any table-level permissions.


PostgreSQL provides a flexible and robust system for managing roles and permissions. Roles can represent users or groups of users, and they can have permissions at the table level or at the database level. Understanding how to create, alter, and drop roles, and how to grant and revoke permissions, is a key part of effectively managing your PostgreSQL databases.

Remember that managing permissions is not just about granting rights; it's also about limiting access to protect your data. Always follow the principle of least privilege: only grant as much access as is necessary for a role to perform its function.

Thanks for reading this guide on roles and permissions in PostgreSQL. I hope you found it helpful!

Sharing is caring

Did you like what Mehul Mohan wrote? Thank them for their work by sharing it on social media.


No comments so far

Curious about this topic? Continue your journey with these coding courses: