web-dev-qa-db-fra.com

Pourquoi je n'ai pas besoin de COMMITER dans le déclencheur de la base de données?

Nous ne pouvons pas COMMIT/ROLLBACK dans les déclencheurs DML car la transaction est gérée manuellement après l'instruction DML. Cependant, les déclencheurs de base de données semblent être une exception. Par exemple, supposons qu'il existe un déclencheur de base de données:

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;

Le déclencheur ne contient pas de procédure de transaction autonome avec validation à l'intérieur, alors qui valide l'insertion? Ce déclencheur fonctionne comme un charme et insère un nouvel enregistrement dans la table des journaux après la connexion de l'utilisateur. Cela sent la fonctionnalité Oracle cachée et je ne trouve aucune référence dans les documents Oracle à ce sujet. J'utilise Oracle11g.

7
Centurion

Vous obtenez automatiquement un contexte de transaction autonome pour ces déclencheurs.

Du CREATE TRIGGER documents:

Un ou plusieurs états particuliers de la base de données qui peuvent provoquer le déclenchement du déclencheur. Vous pouvez créer des déclencheurs pour ces événements sur DATABASE ou SCHEMA, sauf indication contraire. Pour chacun de ces événements déclencheurs, la base de données ouvre une portée de transaction autonome , déclenche le déclencheur et valide toute transaction distincte (quelle que soit la transaction utilisateur existante) .

Ce qui se passe si le déclencheur échoue dépend du déclencheur/événement exact. Voir Gestion des exceptions dans les déclencheurs . En particulier, un déclencheur de connexion qui échoue avec une exception peut très bien bloquer les utilisateurs non-dba - l'exception fait échouer la connexion à moins que l'utilisateur ne dispose de privilèges spécifiques.

13
Mat