Learn how to use PostgreSQL GRANT to give SELECT, INSERT, UPDATE, DELETE and CONNECT privileges to roles. Includes syntax, common privileges, and practical examples.
In PostgreSQL, the GRANT command is used to give permissions (privileges) to users (roles) on database objects like tables, schemas, or databases.
๐ In simple words: GRANT = Give access to someone
We use GRANT to:
๐จโ๐ป Allow users to perform actions like:
SELECT (read data)INSERT (add data)UPDATE (modify data)DELETE (remove data)GRANT privilege(s)
ON object_name
TO role_name;
| Privilege | Meaning |
|---|---|
| SELECT | Read data |
| INSERT | Add new rows |
| UPDATE | Modify existing data |
| DELETE | Remove rows |
| ALL | All privileges |
CREATE ROLE trainee WITH LOGIN PASSWORD '1234';
GRANT SELECT ON customer TO trainee;
๐ Now trainee can only view data from customer table.
GRANT SELECT, INSERT, UPDATE
ON customer
TO trainee;
๐ Now user can:
GRANT CONNECT ON DATABASE dvdrental TO trainee;
๐ Allows user to connect to the dvdrental database.
REVOKE.Learn how to control access using GRANT.
CREATE ROLE student1 WITH LOGIN PASSWORD 'pass123';
GRANT CONNECT ON DATABASE dvdrental TO student1;
GRANT SELECT ON film TO student1;
๐ Test: Login as student1 and run:
SELECT * FROM film;
INSERT INTO film(title) VALUES ('Test Movie');
โ This should fail (no INSERT permission)
GRANT INSERT ON film TO student1;
๐ Try INSERT again โ โ Should work
GRANT ALL ON film TO student1;
vieweractor tableGRANT = Give permissionBelow is a complete step-by-step real-world university system scenario showing:
โ Database creation โ Table design โ Role creation โ GRANT usage (security layer) โ Testing access like a real system
Using PostgreSQL
We will build a small University Database System where:

ERD Diagram for University Database System
CREATE DATABASE university_db;
๐ Now connect to database:
\c university_db
CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
name VARCHAR(100),
department VARCHAR(50),
email VARCHAR(100)
);
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY,
course_name VARCHAR(100),
credit_hours INT
);
CREATE TABLE enrollments (
enroll_id SERIAL PRIMARY KEY,
student_id INT REFERENCES students(student_id),
course_id INT REFERENCES courses(course_id)
);
CREATE TABLE marks (
mark_id SERIAL PRIMARY KEY,
student_id INT REFERENCES students(student_id),
course_id INT REFERENCES courses(course_id),
marks INT
);
CREATE ROLE student WITH LOGIN PASSWORD '123';
CREATE ROLE teacher WITH LOGIN PASSWORD '123';
CREATE ROLE admin WITH LOGIN PASSWORD 'admin123';
GRANT CONNECT ON DATABASE university_db TO student;
GRANT CONNECT ON DATABASE university_db TO teacher;
GRANT CONNECT ON DATABASE university_db TO admin;
GRANT SELECT ON students TO student;
GRANT SELECT ON courses TO student;
GRANT SELECT ON enrollments TO student;
GRANT SELECT ON marks TO student;
๐ Students can ONLY VIEW data
โ Cannot insert/update/delete
GRANT SELECT ON students TO teacher;
GRANT SELECT ON courses TO teacher;
GRANT SELECT ON enrollments TO teacher;
GRANT SELECT, INSERT, UPDATE ON marks TO teacher;
GRANT ALL PRIVILEGES ON students TO admin;
GRANT ALL PRIVILEGES ON courses TO admin;
GRANT ALL PRIVILEGES ON enrollments TO admin;
GRANT ALL PRIVILEGES ON marks TO admin;
INSERT INTO students (name, department, email)
VALUES
('Ali Khan', 'CS', 'ali@uni.edu'),
('Sara Ahmed', 'IT', 'sara@uni.edu');
INSERT INTO courses (course_name, credit_hours)
VALUES
('Database Systems', 3),
('Web Development', 4);
SELECT * FROM students;
โ Allowed
INSERT INTO students(name, department, email)
VALUES ('Test Student', 'CS', 'test@uni.edu');
๐ ERROR: permission denied
SELECT * FROM students;
INSERT INTO marks(student_id, course_id, marks)
VALUES (1, 1, 85);
UPDATE marks
SET marks = 90
WHERE student_id = 1;
DELETE FROM students WHERE student_id = 2;
โ Works
| Role | Access Level |
|---|---|
| Student | Read only (library access) |
| Teacher | Edit marks + view data |
| Admin | Full control (system owner) |
โ GRANT = give permission โ REVOKE = remove permission โ Roles = users or groups
๐ Without GRANT: Users cannot even see tables
In this real-world university system:
โ Database created โ Tables designed โ Roles created โ Permissions assigned using GRANT โ Access controlled by role type