Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
eu tenho uma tabela funcionário com uma coluna salário e criei uma nova coluna do tipo salário eu pensei em uma trigger
para que todas as vezes que um funcionário receba um aumento, nessa nova coluna seja registrada a quantia do último aumento recebido
mas quando executo o update da erro;
outra duvida dentro do update como o update sabe que é só deste funcionario? o que colocar na clausula where dentro da trigger?
CREATE OR REPLACE TRIGGER new_salario_emp
BEFORE UPDATE
ON emp
FOR EACH ROW
-- salario := :new.sal - :OLD.sal;
--
update emp set old_salario = salario;
commit;
--
END;Infelizmente eu não posso criar uma nova tabela, a ideia foi justamente criar esta nova coluna para guardar o valor que foi dado como aumento.
Sim pode perder..pois a cada updade neste funcionario eu só vou guardar o ultimo valor.
Mas esta correto desta forma que eu fiz?
Pois não esta funcionando esta dando um erro de trigger mutante quando tento fazer um update.
>
13 minutos atrás, Motta disse:
Outra dúvida como o update pega apenas o funcionario que esta sendo feito o update como colocar uma clausula where dentro da trigger sabendo o funcionario que esta atualizando o salario?
OR EACH ROW a trigger será acionada para csda LINHA da tabela , no caso teu funcionário.
STATEMENT a trigger será acionada pelo declaração toda quantas linhas atinja.
Doc
https://www.devmedia.com.br/triggers-pl-sql-saiba-quando-e-por-que-usar/30011
https://www.devmedia.com.br/criacao-de-triggers-no-oracle/13039
Eu vi que não se pode fazer um update na mesma tabela que esta sendo feito um update
pois gera este erro:
ora - 00060: conflito detectado ao aguardar recurso
Não tem nenhuma forma da trigger atualizar a coluna da minha tabela em que estou fazendo um update pois não é a mesma coluna
estou fazendo este update: update EMP set sal = 1000 where empno = 6799
e quando faço este update na coluna sal_novo a trigger tinha q atualizar pegando o valor novo - valor antigo e guardar e toda vez que eu fizer um update neste cara guardar o ultimo valorCREATE OR REPLACE TRIGGER new_salario_emp
BEFORE UPDATE--BEFORE POIS SERÁ ALTERADA UMA COLUNA
ON emp
FOR EACH ROW--PARA CADA LINHA
--BEGIN
:NEW.old_salario := :OLD.sal;--ATRIBUI O VALOR ANTERIOR DE SAL A old_salario NAO PODE COMMITAR AQUI
--
END;
Motta se eu criar uma tabela_log como intermediaria ai inserir após o update e depois que inserir disparar uma outra trigger para atualizar a coluna com o valor do aumento ele da erro: ora-00060: conflito detectado ao aguardar recurso
E se eu coloco ao invés de :new :old_salario ele nao atualiza mas também nao da erro você sabe me dizer por que?
CREATE OR REPLACE TRIGGER new_salario_emp
AFTER INSERT
ON emp_log
FOR EACH ROW
--
DECLARE
Pragma Autonomous_Transaction;
--
BEGIN
--
update emp set old_salario = :new.sal - :new.old_salario where empno = :new.empno;
commit;não , seria algo como
CREATE OR REPLACE TRIGGER new_salario_emp
AFTER INSERT
ON emp --a que dispara o log
FOR EACH ROW
--
DECLARE
Pragma Autonomous_Transaction;
--
BEGIN
--
insert into emp__log (colunas) values);--edite este comando
--commit; nunca commit em trigger !!!!!!!!!!!!!!!!!!!A trigger para inserir na tabela log esta certo funcionando o problema é que preciso atualizar a coluna da tabela emp a minha ideia foi depois que inserir na tabela de log (codigo,salario,data,salario novo) eu ia disparar uma nova trigger before insert emp_log fazer o update na coluna da emp mas da erro
CREATE OR REPLACE TRIGGER new_salario_emp
AFTER INSERT
ON emp_log
FOR EACH ROW
DECLARE
Pragma Autonomous_Transaction;
BEGIN
update emp
set old_salario = :new.sal - :new.old_salario
where empno = :old.empno;
end;Meu post acima, basta atribuir direto a uma coluna
Ela gera erro.
Dizendo que nao pode alterar o valor da variavel :new.old_salario
Existe a coluna
old_salario
?
manda o erro do Oracle
>
Em 29/03/2019 at 10:44, Motta disse:
CREATE OR REPLACE TRIGGER new_salario_emp
BEFORE UPDATE--BEFORE POIS SERÁ ALTERADA UMA COLUNA
ON emp
FOR EACH ROW--PARA CADA LINHA
--BEGIN
:NEW.old_salario := :OLD.sal;--ATRIBUI O VALOR ANTERIOR DE SAL A old_salario NAO PODE COMMITAR AQUI
--
END;
Deu certo com esta ação, funcionou corretamente...obrigado
O mais correto seria gravar uma outra tabela de log , tente ler sobre isto.
Todavia no seu exemplo bastaria atribuir o valor a coluna , mas repare que perderá a informação em uma segunda alteração.
BEGIN