Não podemos COMMIT/ROLLBACK em gatilhos DML porque a transação é tratada manualmente após a instrução DML. No entanto, os gatilhos de banco de dados parecem ser uma exceção. Por exemplo, suponha que haja um gatilho de banco de dados:
CREATE OR REPLACE TRIGGER user_login_as
AFTER LOGON
ON SCHEMA
BEGIN
INSERT INTO user_login_log(username, log_date, action) VALUES (user, sysdate, 'User has logged in');
END user_login_as;
O gatilho não contém um procedimento de transação autônomo com commit dentro dele, então quem está confirmando a inserção? Este gatilho funciona como um encanto e insere um novo registro na tabela de log após o logon do usuário. Cheira a funcionalidade oculta do Oracle e não consigo encontrar nenhuma referência nos documentos do Oracle sobre isso. Estou usando Oracle11g.
Você obtém um contexto de transação autônomo para esses gatilhos automaticamente.
Dos
CREATE TRIGGER
documentos:O que acontece se o gatilho falhar depende do gatilho/evento exato. Consulte Tratamento de exceções em gatilhos . Em particular, um gatilho de logon que falha com uma exceção pode muito bem bloquear usuários não dba - a exceção faz com que o logon falhe, a menos que o usuário tenha privilégios específicos.
Uma confirmação dentro de um gatilho anularia a definição básica de uma transação atômica (consulte ACID). A lógica de disparo é, por definição, uma extensão da operação DML original. As alterações feitas nos gatilhos devem, portanto, ser confirmadas ou revertidas como parte da transação na qual são executadas. Por esse motivo, os gatilhos NÃO podem executar as instruções COMMIT ou ROLLBACK (com exceção dos gatilhos autônomos). Aqui está um exemplo do que acontecerá quando eles fizerem isso:
Operações autônomas:
Como solução alternativa, pode-se usar transações autônomas. As transações autônomas são executadas separadamente da transação atual.
Ao contrário dos gatilhos regulares, os gatilhos autônomos podem conter instruções COMMIT e ROLLBACK. Exemplo:
Observe que com o exemplo acima irá inserir e confirmar entradas de log - mesmo se a transação principal for revertida!
Lembre-se de que um procedimento/função/trigger "autonomous_transaction" é uma transação inteira em si e, portanto, deve terminar com uma declaração de confirmação ou de reversão.