2
respostas

Mesmo inserindo EXCEPTION no TRIGGER o instrutor é inserido na tabela

Criei este trigger:

                    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;
                        maior_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 || ' recebe acima da média');
                        END IF;

                        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;

                        IF percentual = 100 THEN
                            SELECT MAX(instrutor.salario) INTO maior_salario FROM instrutor;
                            NEW.salario := maior_salario;
                        END IF;

                        INSERT INTO log_instrutores (informacao, teste)
                            VALUES (NEW.nome || ' recebe mais do que ' || percentual || '% da grade de instrutores');
                        RETURN NEW;

                    EXCEPTION
                        WHEN undefined_column THEN
                            RETURN NEW;    
                    END;

                $$ LANGUAGE plpgsql;

ao executar INSERT INTO instrutor (nome, salario) VALUES ('PESSOA', 6000000), Verifiquei que os dados não são inseridos na tabela log_instrutor, mas são inseridos na tabela instrutor.

2 respostas

Olá Paulo, tudo bem ?

Você chegou a comentar o EXCEPTION e executou a trigger para validar se há algum erro apresentado na execução?

Pelo que entendi do seu código, o primeiro INSERT na tabela log_instrutor só irá acontecer, caso NEW.salario seja MAIOR que media_salarial, correto?

Tem que validar, se no seu caso, está entrando nessa lógica.

No segundo INSERT,

INSERT INTO log_instrutores (informacao, teste) VALUES (NEW.nome || ' recebe mais do que ' || percentual || '% da grade de instrutores');

Você está passando uma segunda coluna chamada teste, e no VALUES você está concatenando a string, portanto será salvo somente no campo informacao , porém deve estar dando um erro, caso na tabela não tenha um valor default para a coluna teste

Verifique esses pontos, e cole a mensagem de erro aqui, caso esteja aparecendo.

Boa tarde.

Sim. Comentei a EXCEPTION e estou passando a segunda coluna chamada teste justamente para gerar o erro. O que ocorre é o seguinte. Na aula é dito que é feito o ROLLBACK de toda transação caso haja um erro, por isso forcei o erro passando uma coluna inexistente. Porém, quando executo INSERT INTO instrutor (nome, salario) VALUES ('PESSOA', 6000000), o registro é inserido na tabela instrutor. Mas, de acordo com o que é dito na aula, isso não deveria acontecer, pois o TRIGGER cria_instrutor é disparado com o insert, é há uma EXCEPTION undefined_column no TRIGGER, logo o insert na tabela instrutor não deveria ocorrer.