Bird
Raised Fist0
SQLquery~20 mins

BEFORE trigger execution in SQL - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
BEFORE Trigger Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ query_result
intermediate
2:00remaining
Output of BEFORE INSERT trigger modifying data
Consider a table users with columns id (int) and username (varchar). A BEFORE INSERT trigger changes the username to uppercase before insertion.
What will be the content of the table after running INSERT INTO users (id, username) VALUES (1, 'alice');?
SQL
CREATE TABLE users (id INT, username VARCHAR(20));
DELIMITER $$
CREATE TRIGGER before_insert_users
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
  SET NEW.username = UPPER(NEW.username);
END$$
DELIMITER ;

INSERT INTO users (id, username) VALUES (1, 'alice');

SELECT * FROM users;
A[{"id": 1, "username": "alice"}]
BSyntaxError
C[{"id": 1, "username": "ALICE"}]
D[]
Attempts:
2 left
💡 Hint
BEFORE triggers can modify the data before it is saved.
❓ query_result
intermediate
2:00remaining
Effect of BEFORE UPDATE trigger on data
Given a table products with columns id and price, a BEFORE UPDATE trigger doubles the price if the new price is less than 100.
What will be the price after executing UPDATE products SET price = 50 WHERE id = 1; if the original price was 80?
SQL
CREATE TABLE products (id INT, price INT);
INSERT INTO products VALUES (1, 80);
DELIMITER $$
CREATE TRIGGER before_update_products
BEFORE UPDATE ON products
FOR EACH ROW
BEGIN
  IF NEW.price < 100 THEN
    SET NEW.price = NEW.price * 2;
  END IF;
END$$
DELIMITER ;

UPDATE products SET price = 50 WHERE id = 1;
SELECT price FROM products WHERE id = 1;
A[{"price": 100}]
B[{"price": 50}]
C[{"price": 80}]
DRuntimeError
Attempts:
2 left
💡 Hint
BEFORE UPDATE triggers can change the new values before saving.
📝 Syntax
advanced
2:00remaining
Identify the syntax error in BEFORE INSERT trigger
Which option contains a syntax error in this BEFORE INSERT trigger definition?
SQL
CREATE TRIGGER before_insert_test
BEFORE INSERT ON test
FOR EACH ROW
BEGIN
  SET NEW.value = NEW.value + 1;
END;
ATrigger name is invalid
BFOR EACH ROW keyword is missing
CNEW keyword cannot be used in BEFORE triggers
DMissing DELIMITER change before and after trigger definition
Attempts:
2 left
💡 Hint
In MySQL, triggers require changing the delimiter to define the body.
🧠 Conceptual
advanced
2:00remaining
When does a BEFORE trigger execute?
Choose the correct statement about when a BEFORE trigger executes in relation to the triggering SQL statement.
ABEFORE triggers execute before each row is inserted, updated, or deleted
BBEFORE triggers execute before the triggering statement starts
CBEFORE triggers execute after the data is written to the table
DBEFORE triggers execute only after the transaction commits
Attempts:
2 left
💡 Hint
Think about when you want to modify data before it is saved.
🔧 Debug
expert
3:00remaining
Why does this BEFORE INSERT trigger cause an infinite loop?
A BEFORE INSERT trigger on table orders tries to insert a row into the same table inside its body.
What is the main reason this causes an infinite loop?
SQL
CREATE TRIGGER before_insert_orders
BEFORE INSERT ON orders
FOR EACH ROW
BEGIN
  INSERT INTO orders (id, amount) VALUES (NEW.id + 1, NEW.amount);
END;
AThe trigger syntax is invalid and causes a syntax error
BThe trigger recursively calls itself because the INSERT inside the trigger fires the same trigger again
CThe NEW keyword cannot be used inside INSERT statements
DTriggers cannot perform INSERT operations on any table
Attempts:
2 left
💡 Hint
Think about what happens when the trigger's INSERT runs.

Practice

(1/5)
1. What is the main purpose of a BEFORE trigger in SQL?
easy
A. To execute code after data is inserted or updated
B. To delete data automatically
C. To execute code before a data modification happens
D. To create a backup of the database

Solution

  1. Step 1: Understand trigger timing

    A BEFORE trigger runs before the data change happens, allowing checks or modifications.
  2. Step 2: Compare options

    To execute code before a data modification happens correctly states the trigger runs before data modification. Options A, C, and D describe other actions not related to BEFORE triggers.
  3. Final Answer:

    To execute code before a data modification happens -> Option C
  4. Quick Check:

    BEFORE trigger = runs before data change [OK]
Hint: BEFORE triggers run before data changes happen [OK]
Common Mistakes:
  • Confusing BEFORE with AFTER triggers
  • Thinking triggers delete data automatically
  • Assuming triggers create backups
2. Which of the following is the correct syntax to create a BEFORE INSERT trigger in SQL?
easy
A. CREATE TRIGGER trg BEFORE DELETE ON table_name FOR EACH ROW BEGIN ... END;
B. CREATE TRIGGER trg AFTER INSERT ON table_name BEGIN ... END;
C. CREATE TRIGGER trg BEFORE UPDATE ON table_name FOR EACH ROW BEGIN ... END;
D. CREATE TRIGGER trg BEFORE INSERT ON table_name FOR EACH ROW BEGIN ... END;

Solution

  1. Step 1: Identify correct trigger timing and event

    The question asks for a BEFORE INSERT trigger, so timing is BEFORE and event is INSERT.
  2. Step 2: Match syntax

    CREATE TRIGGER trg BEFORE INSERT ON table_name FOR EACH ROW BEGIN ... END; matches CREATE TRIGGER trg BEFORE INSERT ON table_name FOR EACH ROW BEGIN ... END;. Other options have wrong timing or event.
  3. Final Answer:

    CREATE TRIGGER trg BEFORE INSERT ON table_name FOR EACH ROW BEGIN ... END; -> Option D
  4. Quick Check:

    BEFORE INSERT syntax = CREATE TRIGGER trg BEFORE INSERT ON table_name FOR EACH ROW BEGIN ... END; [OK]
Hint: BEFORE triggers use 'BEFORE event ON table' syntax [OK]
Common Mistakes:
  • Using AFTER instead of BEFORE
  • Mixing INSERT with UPDATE or DELETE
  • Omitting FOR EACH ROW clause
3. Given this trigger code:
CREATE TRIGGER check_age BEFORE INSERT ON users FOR EACH ROW BEGIN IF NEW.age < 18 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Age must be 18 or older'; END IF; END;

What happens if you try to insert a user with age 16?
medium
A. The insert fails with an error message 'Age must be 18 or older'
B. The age is automatically set to 18
C. The insert is ignored silently
D. The insert succeeds and user is added

Solution

  1. Step 1: Understand trigger logic

    The trigger checks if NEW.age is less than 18 and raises an error if true.
  2. Step 2: Apply to age 16

    Since 16 < 18, the trigger raises an error with message 'Age must be 18 or older', stopping the insert.
  3. Final Answer:

    The insert fails with an error message 'Age must be 18 or older' -> Option A
  4. Quick Check:

    BEFORE trigger can stop invalid inserts [OK]
Hint: BEFORE triggers can block invalid data with SIGNAL [OK]
Common Mistakes:
  • Thinking insert succeeds despite error
  • Assuming silent ignore instead of error
  • Believing trigger changes data automatically
4. Consider this trigger code:
CREATE TRIGGER trg BEFORE UPDATE ON products FOR EACH ROW BEGIN SET NEW.price = NEW.price * 0.9; END;

When trying to create this trigger, you get an error. What is the likely cause?
medium
A. The syntax is missing a delimiter or semicolon inside the body
B. The trigger body must be enclosed in BEGIN and END
C. The trigger must specify FOR EACH ROW for row-level triggers
D. You cannot modify NEW values in a BEFORE UPDATE trigger

Solution

  1. Step 1: Check trigger syntax

    The trigger body uses multiple statements and must handle delimiters properly.
  2. Step 2: Identify missing delimiter

    Without changing the delimiter, the semicolon inside the body ends the statement early, causing syntax error.
  3. Final Answer:

    The syntax is missing a delimiter or semicolon inside the body -> Option A
  4. Quick Check:

    Use DELIMITER to define trigger body [OK]
Hint: Use DELIMITER to avoid semicolon conflicts in triggers [OK]
Common Mistakes:
  • Thinking NEW values can't be changed in BEFORE triggers
  • Ignoring delimiter changes for multi-statement bodies
  • Missing FOR EACH ROW clause
5. You want to ensure that before inserting a new order, the quantity is never negative. Which trigger code correctly enforces this using a BEFORE INSERT trigger?
hard
A. CREATE TRIGGER trg BEFORE INSERT ON orders FOR EACH ROW BEGIN IF NEW.quantity < 0 THEN SET NEW.quantity = 0; END IF; END;
B. CREATE TRIGGER trg BEFORE INSERT ON orders FOR EACH ROW BEGIN IF NEW.quantity < 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Negative quantity not allowed'; END IF; END;
C. CREATE TRIGGER trg AFTER INSERT ON orders FOR EACH ROW BEGIN IF NEW.quantity < 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Negative quantity not allowed'; END IF; END;
D. CREATE TRIGGER trg BEFORE UPDATE ON orders FOR EACH ROW BEGIN IF NEW.quantity < 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Negative quantity not allowed'; END IF; END;

Solution

  1. Step 1: Identify correct timing and event

    We want to check before inserting, so BEFORE INSERT is correct.
  2. Step 2: Check enforcement method

    To stop negative quantity, raising an error with SIGNAL is best. CREATE TRIGGER trg BEFORE INSERT ON orders FOR EACH ROW BEGIN IF NEW.quantity < 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Negative quantity not allowed'; END IF; END; uses BEFORE INSERT and SIGNAL correctly.
  3. Step 3: Eliminate wrong options

    CREATE TRIGGER trg BEFORE INSERT ON orders FOR EACH ROW BEGIN IF NEW.quantity < 0 THEN SET NEW.quantity = 0; END IF; END; silently changes quantity, not enforcing. CREATE TRIGGER trg AFTER INSERT ON orders FOR EACH ROW BEGIN IF NEW.quantity < 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Negative quantity not allowed'; END IF; END; uses AFTER INSERT, too late to stop insert. CREATE TRIGGER trg BEFORE UPDATE ON orders FOR EACH ROW BEGIN IF NEW.quantity < 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Negative quantity not allowed'; END IF; END; uses BEFORE UPDATE, not insert.
  4. Final Answer:

    CREATE TRIGGER trg BEFORE INSERT ON orders FOR EACH ROW BEGIN IF NEW.quantity < 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Negative quantity not allowed'; END IF; END; -> Option B
  5. Quick Check:

    Use BEFORE INSERT + SIGNAL to block invalid data [OK]
Hint: Use BEFORE INSERT with SIGNAL to block bad data [OK]
Common Mistakes:
  • Using AFTER INSERT instead of BEFORE INSERT
  • Silently fixing data instead of raising error
  • Checking on UPDATE instead of INSERT
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard