CREATE OR REPLACE FUNCTION test.test_common_set_and_protect_created_at_timestamp() RETURNS VOID AS $$ DECLARE v_exception_raised BOOLEAN; BEGIN CREATE TABLE test.test (created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, dummy TEXT); CREATE TRIGGER auto1 BEFORE INSERT OR UPDATE ON test.test FOR EACH ROW EXECUTE PROCEDURE common.set_and_protect_created_at_timestamp(); INSERT INTO test.test (dummy) VALUES ('bla'); IF (SELECT created_at != CURRENT_TIMESTAMP FROM test.test) THEN RAISE EXCEPTION 'created_at timestamp does not equal CURRENT_TIMESTAMP.'; END IF; <> BEGIN v_exception_raised := false; INSERT INTO test.test (created_at) VALUES ('2000-01-01'); EXCEPTION WHEN raise_exception THEN v_exception_raised := true; END; PERFORM test.assert(v_exception_raised, 'Inserting a wrong created_at timestamp should not be possible.'); <> BEGIN v_exception_raised := false; UPDATE test.test SET created_at = '2000-01-01'; EXCEPTION WHEN raise_exception THEN v_exception_raised := true; END; PERFORM test.assert(v_exception_raised, 'Changing a created_at timstamp during an update should not be possible.'); END; $$ LANGUAGE plpgsql;