Eu tenho dois esquema de relação:
FUNCIONARIO (CPF. PNOME, SNOME, CPF_GERENTE, NOME_DEPARTAMENTO, SALARIO)
DEPARTAMENTO (NOME_DEPARTAMENTO, NUMERO_FUNCIONARIOS)
O que eu quero fazer é "ao inserir um novo funcionário de um departamento em FUNCIONARIO, soma-se um ao número que esteja em NUMERO_FUNCIONARIOS em DEPARTAMENTO". Assim, crio uma trigger em FUNCIONARIO:
create or replace trigger tri_fun_ndep after insert or update or delete on funcionario
for each row
declare
begin
if updating then
if ( :old.nome_departamento = 'TI' and :new.nome_departamento <> 'TI') then
//update departamento set numero_funcionarios = :old.numero_funcionarios -1
//where nome_departamento = 'TI';
update departamento set numero_funcionarios = (select numero_funcionarios from departamento
where nome_departamento = :new.nome_departamento) - 1 where nome_departamento = 'TI';
end if;
end if;
end;
A linha comentada é como eu gostaria de fazer, pois é mais simples. Simplesmente pegar o valor antigo que se encontra em NUMERO_FUNCIONARIOS em DEPARTAMENTO, subtrair de um e depois salvar. Não posso fazer isso porque a trigger diz que o contexto global é a tabela FUNCIONARIO, gerando o erro:
Erro(39,55): PLS-00049: variável de ligação 'OLD.NUMERO_FUNCIONARIOS' inválida
Uma maneira de fazer funcionar se encontra nas linhas 11 e 12 acima.
Como é que eu posso pegar o valor antigo e novo da tabela DEPARTAMENTO sem fazer o que fiz?