How to postpone firing a trigger

19 janeiro 2022, 17:33 Francisco Regateiro

In order to help with project development (regarding the implementation of mandatory specialization), the example below follows the exercise 3 c) from Lab. 7, and shows how to postpone firing trigger tg_verify_account

CREATE OR REPLACE FUNCTION verify_account()
RETURNS TRIGGER AS
$$
BEGIN
IF NEW.customer_name NOT IN (SELECT customer_name FROM depositor) THEN
RAISE EXCEPTION 'The client % does not have an account in the bank.', new.customer_name;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
 
DROP TRIGGER IF EXISTS tg_verify_account ON borrower;

CREATE CONSTRAINT TRIGGER tg_verify_account
AFTER INSERT ON borrower DEFERRABLE
FOR EACH ROW EXECUTE PROCEDURE verify_account();

INSERT INTO customer VALUES('Alberto','Rua 1','Cascais');

START TRANSACTION;
SET CONSTRAINTS ALL DEFERRED;

-- inserting in borrower before depositor would not be possible without deferring
INSERT INTO borrower VALUES('Alberto', 'L-23');
INSERT INTO depositor VALUES('Alberto', 'A-222');
COMMIT; -- trigger will be fired here

DELETE FROM borrower WHERE customer_name = 'Alberto';
DELETE FROM depositor WHERE customer_name = 'Alberto';
DELETE FROM customer WHERE customer_name = 'Alberto';