-- Database-level invariants complement HTTP validation. ALTER TABLE users ADD CONSTRAINT users_email_normalized CHECK (email = lower(email)); CREATE UNIQUE INDEX users_single_owner ON users (is_owner) WHERE is_owner = true; -- Application-facing audit history is append-only. A dedicated DBA retention -- procedure is required if records ever need to be archived or removed. CREATE FUNCTION reject_audit_mutation() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN RAISE EXCEPTION 'Audit events are append-only'; END; $$; CREATE TRIGGER audit_events_append_only BEFORE UPDATE OR DELETE ON audit_events FOR EACH ROW EXECUTE FUNCTION reject_audit_mutation();