Aqui estão as minhas resoluçẽs para os desafios da Aula 1.
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.
-- Deletando o TRIGGER já existente.
DROP TRIGGER create_instructors_log ON instructor;
-- Alterando a função.
CREATE OR REPLACE FUNCTION new_instructor() RETURNS TRIGGER AS $$
DECLARE
average_salary DECIMAL;
total_instructors INTEGER DEFAULT 0;
low_salary_instructors INTEGER DEFAULT 0;
salary DECIMAL;
percentage DECIMAL(5, 2);
BEGIN
SELECT AVG(instructor.salary) FROM instructor WHERE id != NEW.id INTO average_salary; -- Calcula a média salarial dos instrutores sem contar com o novo instrutor, e armazena o cálculo em average_salary.
IF NEW.salary > average_salary THEN -- Se o salário do instrutor novato for maior do que a média salarial antes da sua adição.
INSERT INTO instructors_log(information) VALUES (NEW.name || ' recebe acima da média atual dos instrutores e não será adicionado.');
RETURN NULL; -- Invalida o INSERT e retorna nulo.
END IF;
FOR salary IN SELECT instructor.salary FROM instructor WHERE id != NEW.id LOOP -- Para cada salário na tabela de instrutores, com exclusão do instrutor novato.
total_instructors := total_instructors + 1; -- Contabiliza o número de instrutores passados no FOR.
IF NEW.salary > salary THEN -- Se o salário do instrutor novato for maior do que o salário verificado no FOR.
low_salary_instructors := low_salary_instructors + 1; -- Aumenta em 1 unidade o valor do número total de instrutores com menor salário que o novo instrutor.
END IF;
END LOOP;
percentage = low_salary_instructors::DECIMAL / total_instructors::DECIMAL * 100; -- Cálculo da porcentagem do número de instrutores com menor salário do que o instrutor novato.
INSERT INTO instructors_log(information) VALUES (NEW.name || ' recebe mais do que ' || percentage || ' % da grade atual de instrutores.'); -- Adiciona ao log uma mensagem informando a porcentagem.
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Recriando o TRIGGER.
CREATE TRIGGER create_instructors_log BEFORE INSERT ON instructor
FOR EACH ROW EXECUTE FUNCTION new_instructor();
Desafio 2: Caso o instrutor inserido receba mais do que 100% dos instrutores existentes, modifique a inserção para que ele passe a receber o mesmo que o instrutor mais bem pago.
-- Deletando o TRIGGER já existente.
DROP TRIGGER create_instructors_log ON instructor;
-- Alterando a função.
CREATE OR REPLACE FUNCTION new_instructor() RETURNS TRIGGER AS $$
DECLARE
average_salary DECIMAL;
total_instructors INTEGER DEFAULT 0;
low_salary_instructors INTEGER DEFAULT 0;
salary DECIMAL;
percentage DECIMAL(5, 2);
BEGIN
SELECT AVG(instructor.salary) FROM instructor WHERE id != NEW.id INTO average_salary; -- Calcula a média salarial dos instrutores sem contar com o novo instrutor, e armazena o cálculo em average_salary.
IF NEW.salary > average_salary THEN -- Se o salário do instrutor novato for maior do que a média salarial antes da sua adição.
INSERT INTO instructors_log(information) VALUES (NEW.name || ' recebe acima da média atual dos instrutores.');
END IF;
FOR salary IN SELECT instructor.salary FROM instructor WHERE id != NEW.id LOOP -- Para cada salário na tabela de instrutores, com exclusão do instrutor novato.
total_instructors := total_instructors + 1; -- Contabiliza o número de instrutores passados no FOR.
IF NEW.salary > salary THEN -- Se o salário do instrutor novato for maior do que o salário verificado no FOR.
low_salary_instructors := low_salary_instructors + 1; -- Aumenta em 1 unidade o valor do número total de instrutores com menor salário que o novo instrutor.
END IF;
END LOOP;
percentage = low_salary_instructors::DECIMAL / total_instructors::DECIMAL * 100; -- Cálculo da porcentagem do número de instrutores com menor salário do que o instrutor novato.
IF percentage >= 100.00 THEN
SELECT MAX(instructor.salary) FROM instructor INTO NEW.salary; -- Seleciona o maior salário em 'salary' da tabela 'instructor' e armazena esse valor em NEW.salary.
END IF;
INSERT INTO instructors_log(information) VALUES (NEW.name || ' recebe mais do que ' || percentage || ' % da grade atual de instrutores e terá seu salário alterado para o maior valor atual.'); -- Adiciona ao log uma mensagem informando a relação entre a porcentagem salarial dos instrutores e a alteração que será realizada no valor do salário do instrutor adicionado.
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Recriando o TRIGGER.
CREATE TRIGGER create_instructors_log BEFORE INSERT ON instructor
FOR EACH ROW EXECUTE FUNCTION new_instructor();
Espero ter ajudado! Se houver algo que possa ser melhorado, por favor, me digam!
Abraço e bons estudos!