sql >> Base de Datos >  >> RDS >> PostgreSQL

limitar el valor del campo con el valor de otra tabla antes de escribir

No necesitas UPDATE dentro de un gatillo. Puede asignar el valor a NEW.votes_used

Usa algo como:

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;

O

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

Debe ser BEFORE UPDATE gatillo para trabajar. (Y como todo BEFORE UPDATE activa debe RETURN NEW ).

Si desea emular la restricción de verificación con el disparador, intente algo como:

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;