Bird
Raised Fist0
PostgreSQLquery~10 mins

BEFORE trigger behavior in PostgreSQL - Interactive Code Practice

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to create a BEFORE INSERT trigger that calls the function.

PostgreSQL
CREATE TRIGGER before_insert_trigger
BEFORE INSERT ON employees
FOR EACH ROW
EXECUTE FUNCTION [1]();
Drag options to blanks, or click blank then click option'
Aupdate_employee
Bcheck_salary
Clog_insert
Dbefore_insert_function
Attempts:
3 left
💡 Hint
Common Mistakes
Using a function name that does not exist.
Confusing AFTER triggers with BEFORE triggers.
2fill in blank
medium

Complete the code to define a BEFORE UPDATE trigger that modifies the NEW row.

PostgreSQL
CREATE FUNCTION [1]() RETURNS trigger AS $$
BEGIN
  NEW.updated_at = NOW();
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Drag options to blanks, or click blank then click option'
Aupdate_timestamp
Bbefore_update_trigger
Cset_update_time
Dupdate_employee
Attempts:
3 left
💡 Hint
Common Mistakes
Using a function name that does not match the trigger purpose.
Not returning NEW in a BEFORE trigger function.
3fill in blank
hard

Fix the error in the trigger function by completing the missing keyword.

PostgreSQL
CREATE FUNCTION validate_salary() RETURNS trigger AS $$
BEGIN
  IF NEW.salary < 0 THEN
    RAISE EXCEPTION 'Salary cannot be negative';
  [1] NEW;
END;
$$ LANGUAGE plpgsql;
Drag options to blanks, or click blank then click option'
AEND
BRAISE
CRETURN
DNEW
Attempts:
3 left
💡 Hint
Common Mistakes
Omitting the RETURN statement causes the trigger to fail.
Using RAISE instead of RETURN for returning the row.
4fill in blank
hard

Fill both blanks to create a BEFORE DELETE trigger that logs the deleted row.

PostgreSQL
CREATE FUNCTION [1]() RETURNS trigger AS $$
BEGIN
  INSERT INTO audit_log(table_name, operation, old_data, changed_at)
  VALUES ('employees', 'DELETE', ROW_TO_JSON([2]), NOW());
  RETURN OLD;
END;
$$ LANGUAGE plpgsql;
Drag options to blanks, or click blank then click option'
Alog_delete
BNEW
COLD
Drecord
Attempts:
3 left
💡 Hint
Common Mistakes
Using NEW instead of OLD in a DELETE trigger.
Not returning OLD in a BEFORE DELETE trigger.
5fill in blank
hard

Fill all three blanks to create a BEFORE INSERT trigger that sets a default value if NULL.

PostgreSQL
CREATE FUNCTION [1]() RETURNS trigger AS $$
BEGIN
  IF NEW.status IS NULL THEN
    NEW.status = [2];
  END IF;
  RETURN [3];
END;
$$ LANGUAGE plpgsql;
Drag options to blanks, or click blank then click option'
Aset_default_status
B'active'
CNEW
D'pending'
Attempts:
3 left
💡 Hint
Common Mistakes
Returning OLD instead of NEW in an INSERT trigger.
Using a wrong default value string.

Practice

(1/5)
1. What is the main purpose of a BEFORE trigger in PostgreSQL?
easy
A. To run code after data is inserted or updated
B. To delete rows automatically
C. To run custom code before data is inserted or updated
D. To create new tables dynamically

Solution

  1. Step 1: Understand trigger timing

    BEFORE triggers execute before the actual data change happens in the table.
  2. Step 2: Identify trigger purpose

    They allow checking or modifying data before it is saved, preventing bad data if needed.
  3. Final Answer:

    To run custom code before data is inserted or updated -> Option C
  4. Quick Check:

    BEFORE trigger = runs before data change [OK]
Hint: BEFORE triggers run before saving data [OK]
Common Mistakes:
  • Confusing BEFORE with AFTER triggers
  • Thinking triggers create or delete tables
  • Assuming triggers run only after data changes
2. Which of the following is the correct syntax to create a BEFORE INSERT trigger on a table named users?
easy
A. CREATE TRIGGER trg BEFORE INSERT ON users CALL func();
B. CREATE TRIGGER trg AFTER INSERT ON users EXECUTE FUNCTION func();
C. CREATE TRIGGER trg BEFORE INSERT INTO users EXECUTE FUNCTION func();
D. CREATE TRIGGER trg BEFORE INSERT ON users EXECUTE FUNCTION func();

Solution

  1. Step 1: Check trigger timing and event

    The trigger must be BEFORE INSERT on the table users.
  2. Step 2: Verify syntax for calling function

    PostgreSQL uses EXECUTE FUNCTION to call the trigger function.
  3. Final Answer:

    CREATE TRIGGER trg BEFORE INSERT ON users EXECUTE FUNCTION func(); -> Option D
  4. Quick Check:

    Correct syntax uses BEFORE INSERT ON and EXECUTE FUNCTION [OK]
Hint: Use BEFORE INSERT ON table EXECUTE FUNCTION func() [OK]
Common Mistakes:
  • Using AFTER instead of BEFORE
  • Writing INTO instead of ON
  • Using CALL instead of EXECUTE FUNCTION
3. Consider this BEFORE INSERT trigger function that changes the new row's status to 'active':
CREATE FUNCTION set_status() RETURNS trigger AS $$
BEGIN
  NEW.status := 'active';
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trg_set_status BEFORE INSERT ON accounts
FOR EACH ROW EXECUTE FUNCTION set_status();

INSERT INTO accounts (id, status) VALUES (1, 'pending');
SELECT status FROM accounts WHERE id = 1;

What will be the output of the SELECT query?
medium
A. active
B. NULL
C. pending
D. Error: cannot insert

Solution

  1. Step 1: Understand BEFORE INSERT trigger effect

    The trigger sets NEW.status to 'active' before the row is inserted.
  2. Step 2: Check inserted data

    Even though 'pending' was given, the trigger changes it to 'active' before saving.
  3. Final Answer:

    active -> Option A
  4. Quick Check:

    BEFORE trigger modifies data before insert [OK]
Hint: BEFORE triggers can modify NEW row data before insert [OK]
Common Mistakes:
  • Assuming original value 'pending' is saved
  • Thinking trigger runs after insert
  • Expecting NULL or error without reason
4. Given this trigger function:
CREATE FUNCTION check_age() RETURNS trigger AS $$
BEGIN
  IF NEW.age < 18 THEN
    RAISE EXCEPTION 'Age must be 18 or older';
  END IF;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

Which problem will occur if you create a BEFORE INSERT trigger using this function and try to insert a row with age = 16?
medium
A. An error will be raised and insertion will stop
B. The trigger will silently ignore the age check
C. The row will be inserted with age 16
D. The age will be automatically set to 18

Solution

  1. Step 1: Analyze trigger logic

    If NEW.age is less than 18, the trigger raises an exception.
  2. Step 2: Understand effect of RAISE EXCEPTION

    Raising an exception stops the insert and returns an error to the client.
  3. Final Answer:

    An error will be raised and insertion will stop -> Option A
  4. Quick Check:

    RAISE EXCEPTION stops insert with error [OK]
Hint: RAISE EXCEPTION in BEFORE trigger stops insert with error [OK]
Common Mistakes:
  • Thinking the row inserts anyway
  • Assuming age auto-corrects
  • Ignoring that exceptions stop execution
5. You want to create a BEFORE UPDATE trigger on the products table that prevents the price from being set below zero. Which trigger function code correctly enforces this rule?
hard
A.
BEGIN
  IF NEW.price < 0 THEN
    NEW.price := 0;
  END IF;
  RETURN NEW;
END;
B.
BEGIN
  IF NEW.price < 0 THEN
    RAISE EXCEPTION 'Price cannot be negative';
  END IF;
  RETURN NEW;
END;
C.
BEGIN
  IF OLD.price < 0 THEN
    RAISE EXCEPTION 'Price cannot be negative';
  END IF;
  RETURN NEW;
END;
D.
BEGIN
  IF NEW.price < 0 THEN
    DELETE FROM products WHERE id = NEW.id;
  END IF;
  RETURN NEW;
END;

Solution

  1. Step 1: Identify correct condition check

    The trigger must check NEW.price to prevent negative values before update.
  2. Step 2: Choose proper action on invalid data

    Raising an exception stops the update and prevents invalid price.
  3. Step 3: Eliminate incorrect options

    BEGIN
      IF NEW.price < 0 THEN
        NEW.price := 0;
      END IF;
      RETURN NEW;
    END;
    silently changes price to 0 (may hide errors), C checks OLD.price (wrong), D deletes row (not appropriate).
  4. Final Answer:

    BEGIN IF NEW.price < 0 THEN RAISE EXCEPTION 'Price cannot be negative'; END IF; RETURN NEW; END; -> Option B
  5. Quick Check:

    Use RAISE EXCEPTION on NEW.price < 0 to stop update [OK]
Hint: Raise error on NEW.price < 0 to block update [OK]
Common Mistakes:
  • Checking OLD.price instead of NEW.price
  • Silently fixing invalid data instead of error
  • Deleting rows inside BEFORE trigger