– Ensure there is no more than one scheduler CREATE UNIQUE INDEX que_scheduler_job_in_que_jobs_unique_index ON que_jobs(job_class) WHERE job_class = 'Que::Scheduler::SchedulerJob';

– Ensure there is at least one scheduler CREATE OR REPLACE FUNCTION que_scheduler_check_job_exists() RETURNS bool AS $$ SELECT EXISTS(SELECT * FROM que_jobs WHERE job_class = 'Que::Scheduler::SchedulerJob'); $$ LANGUAGE SQL;

CREATE OR REPLACE FUNCTION que_scheduler_prevent_job_deletion() RETURNS TRIGGER AS $BODY$ DECLARE BEGIN

IF OLD.job_class = 'Que::Scheduler::SchedulerJob' THEN
    IF NOT que_scheduler_check_job_exists() THEN
        raise exception 'Deletion of que_scheduler job % prevented. Deleting the que_scheduler job is almost certainly a mistake.', OLD.job_id;
    END IF;
END IF;
RETURN OLD;

END; $BODY$ LANGUAGE 'plpgsql';

CREATE CONSTRAINT TRIGGER que_scheduler_prevent_job_deletion_trigger AFTER UPDATE OR DELETE ON que_jobs DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE que_scheduler_prevent_job_deletion();