2009-02-24 6 views
1

Je souhaite utiliser la procédure raise_application_error pour interrompre le processus de connexion. J'ai écrit un déclencheur, qui vérifie la chaîne TERMINAL, si elle est correcte (je sais que ce n'est pas vraiment sécurisé, mais au début, c'est suffisant) Donc le Trigger fonctionne bien et fait ce que je veux, mais le raise_application_error cause une annulation et envoie pas l'exception que je veux. Lorsque je me connecte à la base de données avec mon application, l'erreur raise_application_error n'arrête pas l'application. Première question: Est-ce la bonne façon, d'arrêter la connexion à la base de données avec la mauvaise application? Deuxième question: Si oui, quel est le problème?Oracle Trigger: raise_application_error

create or replace 
TRIGGER after_logon_on_database 
AFTER LOGON ON DATABASE 
BEGIN 
IF sys_context('USERENV', 'TERMINAL')='IAS' THEN 
    INSERT INTO event_log 
    (event_date, event_time, username, event_case, event_comment) 
    VALUES 
    (SYSDATE, to_char(sysdate, 'hh24:mi:ss'), USER, 'LOGON-SUCCESS', sys_context('USERENV', 'TERMINAL')); 
ELSE 
    INSERT INTO event_log 
    (event_date, event_time, username, event_case, event_comment) 
    VALUES 
    (SYSDATE, to_char(sysdate, 'hh24:mi:ss'), USER, 'LOGON-FAILURE', sys_context('USERENV', 'TERMINAL')); 
    RAISE_APPLICATION_ERROR(-20001, 'Access denied!'); 
END IF; 
END after_logon_on_database; 

Répondre

0

Dans la deuxième partie de l'IF/ELSE, ajoutez une validation; déclaration entre l'insertion et la hausse. Cela garantira que le message d'échec de connexion est correctement inséré dans la base de données.

Vous êtes conscient que le déclencheur sur-connexion n'empêchera pas l'utilisateur de se connecter s'il s'agit d'un administrateur de base de données (avec le rôle DAB). C'est une fonctionnalité qui permet à quelqu'un de toujours avoir accès à la base de données pour réparer un déclencheur d'ouverture de session.

Vous avez également raison que le déclencheur n'augmente pas (comme le premier message d'erreur retourné par Oracle) l'erreur -20001. Il retournera à la place un -604 (ORA-00604: erreur survenue au niveau SQL récursif 1). Vous n'exécutez pas directement le déclencheur lors de la connexion, il est exécuté à quelques pas. Vous voulez que votre application gère correctement cette erreur.