Eu gostaria de impedir que uma tupla fosse apagada de minha relação. Ao efetuar o comando delete, ao invés de excluir a linha, gostaria que um campo específico tivesse o seu valor alterado.
Por exemplo: PROJETO (NUMERO_PROJETO, NOME_PROJETO, ESTADO)
O valor default de ESTADO é “em andamento”. Ao executar o comando delete em qualquer linha de PROJETO, o valor de ESTADO mudaria para “finalizado”.
Eu estou com problema para criar esse trigger em Oracle:
create trigger tri_pro_delete before delete
for each row
begin
…
end;
Eu não quero trabalhar nem com concessão nem com revogação de privilégios.
Há como eu realizar uma operação na tabela quando uma outra for efetuada? Nesse meu caso, estou atualizando ao invés de excluir.
Então, como a transação a executar é um delete, você quer converte-la para um UPDATE com suspensão do DELETE.
Para suspender é somente como eu te disse, lançando erro.
Agora, você pode “tentar” recorrer ao AUTONOMOUS TRANSACTION para você realizar modificar o campo estado, fazer commit e após isso lançar a exceção para tentar cancelar o delete.
Veja um exemplo de AUTONOMOUS TRANSACTION do Oracle aplicado em trigger:
CREATE TRIGGER tabela_trigger BEFORE INSERT ON tabela
FOR EACH ROW
DECLARE PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
UPDATE tabela SET :new.estado = ‘excluido’ WHERE id = :new.id;
COMMIT; – Confirma transação
raise_application_error(-20100, ‘A tabela X não pode sofrer delete.’); – Lança erro
END;
Eu não tenho banco de dados para testar isso aqui, mas a transação autônoma pode ser a saída.
[quote=wiliamps]Então, como a transação a executar é um delete, você quer converte-la para um UPDATE com suspensão do DELETE.
Para suspender é somente como eu te disse, lançando erro.
Agora, você pode “tentar” recorrer ao AUTONOMOUS TRANSACTION para você realizar modificar o campo estado, fazer commit e após isso lançar a exceção para tentar cancelar o delete.
Veja um exemplo de AUTONOMOUS TRANSACTION do Oracle aplicado em trigger:
CREATE TRIGGER tabela_trigger BEFORE INSERT ON tabela
FOR EACH ROW
DECLARE PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
UPDATE tabela SET :new.estado = ‘excluido’ WHERE id = :new.id;
COMMIT; – Confirma transação
raise_application_error(-20100, ‘A tabela X não pode sofrer delete.’); – Lança erro
END;
Eu não tenho banco de dados para testar isso aqui, mas a transação autônoma pode ser a saída.