PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

valore del campo limite con il valore di un'altra tabella prima della scrittura

Non hai bisogno di UPDATE dentro un grilletto. Puoi assegnare il valore a NEW.votes_used

Usa qualcosa come:

BEGIN
    IF (NEW.votes_used > (SELECT votes_available FROM vote_totals 
     WHERE vote_totals.user_id = NEW.user_id)) THEN
        NEW.votes_used := (SELECT votes_available FROM vote_totals 
         WHERE vote_totals.userID = NEW.user_id);
    END IF;
    RETURN NEW;
END;

Oppure

BEGIN
    NEW.votes_used := LEAST(NEW.votes_used, (SELECT votes_available 
                                             FROM vote_totals 
                                             WHERE vote_totals.userID = NEW.user_id));
    RETURN NEW;
END;

Deve essere un BEFORE UPDATE innesco per lavorare. (E come tutti i BEFORE UPDATE attiva deve RETURN NEW ).

Se vuoi emulare il vincolo di controllo con il trigger, prova qualcosa come:

BEGIN
    IF (NEW.votes_used > (SELECT votes_available  
                          FROM vote_totals 
                          WHERE vote_totals.user_id = NEW.user_id)) 
    THEN RAISE EXCEPTION 'Not enough votes';
    END IF;
    RETURN NEW;
END;