1
resposta

Minha resposta DESAFIO 1

--Caso o instrutor inserido receba acima da média, cancele a instrução, ou seja, não permita que a inserção ocorra.

CREATE OR REPLACE FUNCTION cria_instrutor()
    RETURNS TRIGGER
    AS $$
    DECLARE
        media_salarial DECIMAL;
        instrutores_recebem_menos INTEGER DEFAULT 0;
        total_instrutores INTEGER DEFAULT 0;
        salario DECIMAL;
        percentual DECIMAL(5,2);
    BEGIN
        SELECT AVG(instrutor.salario) INTO media_salarial FROM instrutor WHERE id <> NEW.id;
        IF NEW.salario > media_salarial THEN
            INSERT INTO log_instrutores (informacao) VALUES (NEW.nome || ' receberia acima da média. Salário não permitido.');
            RETURN NULL;
        ELSE
            FOR salario IN SELECT instrutor.salario FROM instrutor WHERE id <> NEW.id LOOP
                total_instrutores := total_instrutores + 1;            
                    IF NEW.salario > salario THEN
                        instrutores_recebem_menos := instrutores_recebem_menos + 1;
                    END IF;            
            END LOOP;                
            percentual = instrutores_recebem_menos::DECIMAL / total_instrutores::DECIMAL * 100;
            INSERT INTO log_instrutores (informacao) 
                 VALUES (NEW.nome || ' recebe mais do que ' || percentual || '% da grade de instrutores');
            RETURN NEW;
        END IF;
    END $$
LANGUAGE plpgsql;

CREATE TRIGGER cria_log_instrutores BEFORE INSERT ON instrutor
    FOR EACH ROW EXECUTE FUNCTION cria_instrutor();
1 resposta

Oi, Lucas!! Tudo certo por aí?

Peço desculpas pela demora em retornar.

Mandou super bem na resolução do desafio, parabéns!

Caso surja alguma dúvida ao decorrer dos seus estudos, fico à disposição.

Abraços.