Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/06/2011, 09h37   #1
Membre éclairé
 
Avatar de yodaime
 
Développeur informatique
Inscription : avril 2006
Messages : 282
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2006
Messages : 282
Points : 302
Points : 302
Par défaut Savoir qui a déclenché le trigger

Bonjour,

Je vous expose ce que j'aimerais faire.

Je voudrais créer un trigger de delete qui des qu'une ligne est deleter de ma table, insere dans une autre table la ligne deleter, l'heure ainsi que la personne/programme qui a fait le delete.

Mon problème est donc de savoir si il y a un moyen de connaitre la personne/programme qui a declenché le trigger.

Est possible ? (Je sais qu'on peu le faire avec Sybase)

J'espère avoir été clair.

Merci d'avance de vos réponses
__________________
http://yodaime08.labrute.fr
yodaime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 10h03   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 433
Points : 10 433
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Probablement avec SYS_CONTEXT :
Code :
1
2
SELECT sys_context('USERENV', 'OS_USER')
  FROM dual;
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 10h54   #3
Membre éclairé
 
Avatar de yodaime
 
Développeur informatique
Inscription : avril 2006
Messages : 282
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2006
Messages : 282
Points : 302
Points : 302
Effectivement, c'est exactement ça !

Merci beaucoup
__________________
http://yodaime08.labrute.fr
yodaime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 11h53   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 810
Points : 5 810
Juste une petit remarque: ça marche bien en client-serveur mais ça pourrait être non concluant en trois tiers.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 12h36   #5
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
Bonjour

1. ajouter les champs suivants dans votre table audit
Code :
1
2
3
4
5
6
7
 
         USR_INS             VARCHAR2(48)
	USR_UPD            VARCHAR2(48)
	DAT_UPD            DATE
	DAT_INS            DATE
	PGM_UPD            VARCHAR2(100)
	PGM_INS            VARCHAR2(100)
2. ajouter un trigger(before update/delete) sur votre table cible

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
 
  CREATE OR REPLACE TRIGGER audit_trig
 BEFORE DELETE
 ON table_cible
 REFERENCING OLD AS OLD NEW AS NEW
 FOR EACH ROW
DECLARE
   lv_module       VARCHAR2(48);
   lv_action       VARCHAR2(48);
   ld_current_date DATE         := SYSDATE;
   lv_current_user VARCHAR2(48) := USER;
BEGIN
   dbms_application_info.read_module(lv_module, lv_action);
   :NEW.usr_upd := lv_current_user;
   :NEW.dat_upd := ld_current_date;
   :NEW.pgm_upd := lv_module;
 
  INSERT INTO table_audit VALUES (x,y,z,...,:NEW.usr_upd, :NEW.dat_upd ,:NEW.pgm_upd );
 
EXCEPTION
  WHEN OTHERS THEN
    RAISE
END audit_trig;
/
Bien à vous

Mohamed Houri
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 16/06/2011, 13h55   #6
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 810
Points : 5 810
Citation:
Envoyé par Mohamed.Houri Voir le message
...
Code :
1
2
3
4
5
6
 
...
EXCEPTION
  WHEN OTHERS THEN
    RAISE
...
Pas beau
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 14h51   #7
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
Citation:
Envoyé par mnitu Voir le message
Pas beau
Quand cela n'est pas bon, il faut nous éclairer pourque l'on puisse se corriger
n'est ce pas?

Pas beau : ne nous apporte rien, ni à moi ni à ceux qui veulent savoir pourquoi.

Quant à la gestion des exceptions, Tom Kyte aurait aimer que le when others exception disparraisse du kernel PL/SQL à cause du nombre impressionant de personnes qui codent comme suit:
Code :
1
2
3
 
WHEN OTHERS THEN
 NULL;
C'est pourquoi je préfère ceci
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
CREATE OR REPLACE TRIGGER xxx_TRG
 BEFORE UPDATE
 ON xxx_tab
 REFERENCING OLD AS OLD NEW AS NEW
 FOR EACH ROW
DECLARE
   lv_module VARCHAR2(48);
   lv_action VARCHAR2(48);
   ld_current_date DATE := SYSDATE;
   lv_current_user VARCHAR2(48) := USER;
BEGIN
   dbms_application_info.read_module(lv_module, lv_action);
   :NEW.usr_upd := lv_current_user;
   :NEW.dat_upd := ld_current_date;
   :NEW.pgm_upd := lv_module;
EXCEPTION
  WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR('-20000','xxx_trg');
END xxx_trg;
/
Ou carrément ceci (sans gestion des exceptions)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
 
CREATE OR REPLACE TRIGGER xxx_TRG
 BEFORE UPDATE
 ON xxx_tab
 REFERENCING OLD AS OLD NEW AS NEW
 FOR EACH ROW
DECLARE
   lv_module VARCHAR2(48);
   lv_action VARCHAR2(48);
   ld_current_date DATE := SYSDATE;
   lv_current_user VARCHAR2(48) := USER;
BEGIN
   dbms_application_info.read_module(lv_module, lv_action);
   :NEW.usr_upd := lv_current_user;
   :NEW.dat_upd := ld_current_date;
   :NEW.pgm_upd := lv_module;
END xxx_trg;
/
Bien à vous

Mohamed Houri
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 15h35   #8
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 810
Points : 5 810
Citation:
Envoyé par Mohamed.Houri Voir le message
Quand cela n'est pas bon, il faut nous éclairer pourque l'on puisse se corriger
n'est ce pas?
...
AskTom
Citation:
why do people do this?????

EXCEPTION
WHEN OTHERS THEN
RAISE;
END;


what is the point, other than to make the code infinitely harder to debug. You know what you did by coding that?
...
So, the error is

EXCEPTION
WHEN OTHERS THEN
RAISE;
END;

remove them all, don't code that again, and then you'll find out where to look in your code.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 15h39   #9
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 810
Points : 5 810
Citation:
Envoyé par Mohamed.Houri Voir le message
...
C'est pourquoi je préfère ceci
Code :
1
2
3
4
5
6
 
...EXCEPTION
  WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR('-20000','xxx_trg');
END xxx_trg;
/
...

Why do people do this?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 15h47   #10
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
Citation:
Envoyé par mnitu Voir le message
Oui mais contrairement à

Code :
1
2
3
 
WHEN OTHERS THEN
  NULL;
Ceci n'est pas un bug

Code :
1
2
3
 
WHEN OTHERS THEN
  RAISE;
Savez vous que Tom Kyte a demandé pour la release 11g de supprimer le WHEN OTHERS THEN?

Mais le kernel PL/SQL ne l'a pas suivi. Il a juste ajouté un Warning lorsque ceci est codé

Code :
1
2
3
 
WHEN OTHERS THEN
  NULL;
Je vais arreter là. Le bug est dans l'exception qui n'est pas suivi d'un RAISE et non l'inverse

Bien à vous

Mohamed Houri
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 16h25   #11
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 810
Points : 5 810
Tom Kyte n’a pas demandé de supprimer l’exception WHEN OTHERS THEN… Pouvez-vous vous imaginer l’impact d’une telle modification sur l’ensemble du code existant ? Ce qu’il a demandé c’est exactement ce qui a été fait.

"Pas beau" ne signifie pas un bug mais tout simplement du code qui « fonctionne » mais qui en réalité pose certaines problèmes, relisez donc les deux liens que j’aie vous indiqués pour comprendre pour quoi.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h26.


 
 
 
 
Partenaires

Hébergement Web