I recently had to build a trigger for the return management system for an eCommerce website. Essentially we had two tables: RETURN
and RETURN_ITEM
.
I had to make a trigger on insert on RETURN_ITEM
, which raises an error and deletes a RETURN
entity.
Let me preface this by saying that it is not a good practice to mix the RAISE
clause with other statements. If you need to, then create multiple triggers. But at the same time, this solution might be useful in a variety of other cases.
The trigger looked something like this:
CREATE TRIGGER RETURN_VALIDATION
BEFORE INSERT ON RETURN_ITEM
FOR EACH ROW
BEGIN
-- The trigger logic
END;
And the solution is as follows:
Perform the CRUD operations with your trigger check in the WHERE clause
If its a read operation, then you can just put that in your case with a SELECT 1 FROM … statement
For everything else, use the changes() API in SQLite to check whether the CRUD operation occurred.
Create a trigger case on the changes() API.
Like this:
DELETE FROM RETURN
WHERE ticket_number = NEW.return_ticket_number AND
NOT EXISTS (
-- My Condition
);
SELECT CASE
WHEN (SELECT changes() > 0) THEN RAISE(FAIL, 'Error')
END;
END;