Row-level security lets you control who can see or change each row in a table. It helps keep data safe by limiting access to only the right people.
Row-level security policies in PostgreSQL
Start learning this pattern below
Jump into concepts and practice - no test required
ALTER TABLE table_name ENABLE ROW LEVEL SECURITY; CREATE POLICY policy_name ON table_name USING (condition); -- Optional: To allow inserts or updates, add WITH CHECK clause CREATE POLICY policy_name ON table_name FOR {SELECT | INSERT | UPDATE | DELETE} TO role_name USING (condition) WITH CHECK (condition);
Enable row-level security on a table before creating policies.
Policies define which rows are visible or modifiable based on conditions.
ALTER TABLE employees ENABLE ROW LEVEL SECURITY; CREATE POLICY employee_policy ON employees USING (user_id = current_user);
CREATE POLICY insert_policy ON employees FOR INSERT TO hr_role WITH CHECK (department = 'HR');
This example creates a documents table with row-level security. Only rows where the owner matches the current user are visible. When the user is 'alice', only her document shows.
CREATE TABLE documents ( id SERIAL PRIMARY KEY, owner TEXT, content TEXT ); ALTER TABLE documents ENABLE ROW LEVEL SECURITY; CREATE POLICY owner_policy ON documents USING (owner = current_user); -- Insert sample data INSERT INTO documents (owner, content) VALUES ('alice', 'Alice''s secret'), ('bob', 'Bob''s notes'); -- Simulate current_user = 'alice' SET SESSION AUTHORIZATION 'alice'; SELECT * FROM documents;
Row-level security policies apply automatically after enabling RLS on a table.
Be careful to test policies to avoid accidentally hiding all rows.
Policies can be combined for different operations like SELECT, INSERT, UPDATE, DELETE.
Row-level security controls access to individual rows in a table.
Enable RLS on a table, then create policies with conditions to filter rows.
This helps keep data safe and simplifies access control in your database.
Practice
Row-level security (RLS) on a PostgreSQL table?Solution
Step 1: Understand what RLS does
Row-level security allows filtering which rows a user can see or modify based on policies.Step 2: Compare options
Only To control access to individual rows based on user-defined policies describes controlling access to individual rows, which is the purpose of RLS.Final Answer:
To control access to individual rows based on user-defined policies -> Option CQuick Check:
RLS controls row access = D [OK]
- Confusing RLS with indexing or encryption
- Thinking RLS backs up data
- Assuming RLS applies to entire tables, not rows
employees?Solution
Step 1: Recall the correct command to enable RLS
The correct syntax isALTER TABLE table_name ENABLE ROW LEVEL SECURITY;.Step 2: Match options with syntax
Only ALTER TABLE employees ENABLE ROW LEVEL SECURITY; matches the exact syntax for enabling RLS on a table.Final Answer:
ALTER TABLE employees ENABLE ROW LEVEL SECURITY; -> Option BQuick Check:
Enable RLS uses ALTER TABLE ... ENABLE ROW LEVEL SECURITY [OK]
- Using SET instead of ENABLE
- Trying to enable RLS without ALTER TABLE
- Using incorrect keywords like ACTIVATE
documents:
CREATE POLICY user_policy ON documents FOR SELECT USING (owner = current_user);What rows will a user see when they run
SELECT * FROM documents;?Solution
Step 1: Understand the policy condition
The policy allows SELECT only ifowner = current_user, so only rows owned by the current user are visible.Step 2: Determine visible rows
Rows where the owner matches the current user will be returned; others are filtered out.Final Answer:
Only rows where the owner column matches the current user -> Option AQuick Check:
Policy filters rows by owner = current_user [OK]
- Assuming all rows are visible despite policy
- Thinking NULL owners are included
- Ignoring the current_user condition
CREATE POLICY update_own ON orders FOR UPDATE USING (user_id = current_user);But users report they can update other users' rows too. What is the likely problem?
Solution
Step 1: Check if RLS is enabled
Policies only work if row-level security is enabled on the table; otherwise, they have no effect.Step 2: Understand the symptom
If users can update rows despite the policy, likely RLS is disabled, ignoring policies and allowing full access.Final Answer:
Row-level security is not enabled on the orders table -> Option DQuick Check:
RLS must be enabled for policies to work [OK]
- Confusing USING and WITH CHECK clauses
- Assuming current_user is unsupported
- Creating policy for wrong command type
projects table only if they are either the project owner or the project is marked as public (is_public = true). Which policy condition correctly implements this?Solution
Step 1: Translate the requirement to logic
Users can see rows if they own the project OR if the project is public.Step 2: Match logic to condition
The OR condition matches the requirement:owner = current_user OR is_public = true.Final Answer:
USING (owner = current_user OR is_public = true) -> Option AQuick Check:
Owner or public projects visible = A [OK]
- Using AND instead of OR, restricting access too much
- Negating conditions incorrectly
- Confusing true and false values
