PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

limite o valor do campo com o valor de outra tabela antes de gravar


Você não precisa de UPDATE dentro de um gatilho. Você pode atribuir o valor a NEW.votes_used

Use 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;

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

Este deve ser um BEFORE UPDATE gatilho para funcionar. (E como todos os BEFORE UPDATE aciona ele deve RETURN NEW ).

Se você quiser emular a restrição de verificação com o gatilho - tente 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;