15 lines
656 B
PL/PgSQL
15 lines
656 B
PL/PgSQL
-- 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();
|