Creating and Using Views with CHECK OPTION in PostgreSQL
📖 Scenario: You are managing a small company's employee database. You want to create a special view that shows only employees from the 'Sales' department. You also want to make sure that any changes made through this view keep employees in the 'Sales' department.
🎯 Goal: Create a PostgreSQL view named sales_employees that shows only employees from the 'Sales' department. Use the WITH CHECK OPTION to ensure that any inserts or updates through this view keep the employee in the 'Sales' department.
📋 What You'll Learn
Create a table named employees with columns id, name, and department.
Insert at least three employees with different departments including 'Sales'.
Create a view named sales_employees that selects only employees from the 'Sales' department.
Add WITH CHECK OPTION to the view to enforce department constraint on inserts and updates.
💡 Why This Matters
🌍 Real World
Views with CHECK OPTION are used in real companies to create safe, filtered access to data. For example, department managers can see and modify only their employees.
💼 Career
Database developers and administrators use views with CHECK OPTION to enforce business rules and data security without changing application code.
Progress0 / 4 steps
1
Create the employees table and insert data
Create a table called employees with columns id (integer), name (text), and department (text). Insert these exact rows: (1, 'Alice', 'Sales'), (2, 'Bob', 'HR'), (3, 'Charlie', 'Sales').
PostgreSQL
Hint
Use CREATE TABLE to define the table and INSERT INTO to add the rows.
2
Create a view for Sales department employees
Create a view named sales_employees that selects all columns from employees where department = 'Sales'.
PostgreSQL
Hint
Use CREATE VIEW and a SELECT statement with a WHERE clause.
3
Add WITH CHECK OPTION to the view
Modify the sales_employees view to include WITH CHECK OPTION at the end to ensure only employees in the 'Sales' department can be inserted or updated through this view.
PostgreSQL
Hint
Add WITH CHECK OPTION at the end of the CREATE VIEW statement.
4
Verify the view enforces the department constraint
Write an INSERT statement that tries to add an employee with department = 'HR' through the sales_employees view. This should fail because of the WITH CHECK OPTION. Then write a correct INSERT statement through the view with department = 'Sales'.
PostgreSQL
Hint
Try inserting a row with department = 'HR' through the view, then insert a row with department = 'Sales'.
Practice
(1/5)
1. What is the main purpose of using WITH CHECK OPTION in a PostgreSQL view?
easy
A. To prevent inserts or updates that violate the view's filter conditions
B. To speed up query execution on the view
C. To allow views to be updated without restrictions
D. To create a temporary table instead of a view
Solution
Step 1: Understand the role of WITH CHECK OPTION
This option ensures that any data inserted or updated through the view must satisfy the view's filter conditions.
Step 2: Identify what it prevents
It prevents changes that would cause rows to fall outside the view's defined criteria, keeping data consistent.
Final Answer:
To prevent inserts or updates that violate the view's filter conditions -> Option A
2. Which of the following is the correct syntax to create a view with a WITH CHECK OPTION in PostgreSQL?
easy
A. CREATE VIEW v AS SELECT * FROM t WHERE x > 10, WITH CHECK OPTION;
B. CREATE VIEW v AS SELECT * FROM t WHERE x > 10 CHECK OPTION WITH;
C. CREATE VIEW v AS SELECT * FROM t WHERE x > 10 WITH CHECK OPTION;
D. CREATE VIEW v AS SELECT * FROM t WHERE x > 10 OPTION CHECK WITH;
Solution
Step 1: Recall PostgreSQL view creation syntax
The correct syntax places WITH CHECK OPTION at the end of the CREATE VIEW statement.
Step 2: Match the exact phrase and order
CREATE VIEW v AS SELECT * FROM t WHERE x > 10 WITH CHECK OPTION; matches the correct syntax: CREATE VIEW v AS SELECT ... WITH CHECK OPTION;
Final Answer:
CREATE VIEW v AS SELECT * FROM t WHERE x > 10 WITH CHECK OPTION; -> Option C
Quick Check:
Correct syntax ends with WITH CHECK OPTION [OK]
Hint: WITH CHECK OPTION always goes at the end of CREATE VIEW [OK]
Common Mistakes:
Swapping words order
Adding semicolons inside SELECT
Using incorrect keywords order
3. Given the table employees(id, name, salary) and the view: CREATE VIEW high_salary AS SELECT * FROM employees WHERE salary > 5000 WITH CHECK OPTION; What happens if you try to insert (10, 'Anna', 4000) into high_salary?
medium
A. The insert fails due to the CHECK OPTION
B. The insert succeeds but the row is not visible in the view
C. The insert succeeds and adds the row
D. The insert causes a syntax error
Solution
Step 1: Understand the view filter and CHECK OPTION
The view only shows employees with salary > 5000, and WITH CHECK OPTION prevents inserts that don't meet this.
Step 2: Analyze the insert data
The salary 4000 is less than 5000, so the insert violates the view's filter and is blocked.
Final Answer:
The insert fails due to the CHECK OPTION -> Option A
Quick Check:
Insert violating view filter blocked = C [OK]
Hint: Insert must meet view filter or it fails [OK]
Common Mistakes:
Thinking insert always succeeds
Assuming row is added but hidden
Confusing syntax error with runtime error
4. You have this view: CREATE VIEW active_users AS SELECT * FROM users WHERE active = true WITH CHECK OPTION; You try to update a row through the view to set active = false. What is the result?
medium
A. The update succeeds and changes the row
B. The update causes a syntax error
C. The update succeeds but the row disappears from the view
D. The update fails because it violates the CHECK OPTION
Solution
Step 1: Understand the view filter and update
The view only shows rows where active = true. WITH CHECK OPTION blocks updates that break this condition.
Step 2: Analyze the attempted update
Setting active = false violates the view filter, so the update is rejected.
Final Answer:
The update fails because it violates the CHECK OPTION -> Option D
Quick Check:
Update violating view filter blocked = B [OK]
Hint: Updates must keep rows inside view filter [OK]
Common Mistakes:
Assuming update succeeds but hides row
Confusing syntax error with constraint error
Ignoring CHECK OPTION effect on updates
5. Consider a view CREATE VIEW vip_customers AS SELECT * FROM customers WHERE vip = true WITH CHECK OPTION; You want to allow inserting new customers through this view only if they are VIPs. Which of the following statements correctly inserts a VIP customer and rejects a non-VIP customer?
hard
A. INSERT INTO vip_customers (id, name, vip) VALUES (1, 'John', false); -- fails INSERT INTO vip_customers (id, name, vip) VALUES (2, 'Jane', false); -- fails
B. INSERT INTO vip_customers (id, name, vip) VALUES (1, 'John', true); -- succeeds INSERT INTO vip_customers (id, name, vip) VALUES (2, 'Jane', false); -- fails
C. INSERT INTO vip_customers (id, name, vip) VALUES (1, 'John', true); -- fails INSERT INTO vip_customers (id, name, vip) VALUES (2, 'Jane', false); -- succeeds
D. INSERT INTO vip_customers (id, name, vip) VALUES (1, 'John', false); -- succeeds INSERT INTO vip_customers (id, name, vip) VALUES (2, 'Jane', true); -- fails
Solution
Step 1: Understand the view filter and CHECK OPTION
The view only allows rows where vip = true. WITH CHECK OPTION blocks inserts with vip = false.
Step 2: Analyze each insert statement
Inserting John with vip = true succeeds. Inserting Jane with vip = false fails due to CHECK OPTION.
Final Answer:
Only inserts with vip = true succeed; others fail -> Option B
Quick Check:
Insert vip=true allowed, vip=false blocked = D [OK]