IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

ALL_SOURCE et trigger on DDL


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier Avatar de Vince7-7
    Homme Profil pro
    Fondateur et dirigeant de la société Oramatica. http://www.oramatica.com
    Inscrit en
    Janvier 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Fondateur et dirigeant de la société Oramatica. http://www.oramatica.com

    Informations forums :
    Inscription : Janvier 2007
    Messages : 125
    Points : 85
    Points
    85
    Par défaut ALL_SOURCE et trigger on DDL
    Bonjour.
    Sur Oracle 11GR2.
    J'ai un trigger ON DDL dans lequel j'essaie de récupérer le code de l'objet modifier. Je fais un select sur la vue ALL_SOURCE et il ne me renvoie rien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select text 
    from all_source
    where name=ora_dict_obj_name
    and owner=ora_dict_obj_owner
    and type = ora_dict_obj_type
    en lançant la même requête hors du trigger cela me retourne bien mon code.
    Quelqu'un aurait une idée du pourquoi de la chose?
    Fondateur et dirigeant de la société Oramatica. Spécialiste du traitement de vos données.
    http://www.oramatica.com

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Tu peux poster ton code ?
    Mon test a bien récupéré le source d'une fonction que j'ai recompilé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    CREATE TABLE WMCDDL (username varchar2(30),
    datetrig DATE,
    ddl_type VARCHAR2(30),
    obj_owner VARCHAR2(30),
    obj_type VARCHAR2(12),
    obj_name VARCHAR2(30),
    src VARCHAR2(4000));
     
    CREATE TRIGGER DDLTrigger
    AFTER DDL ON DATABASE
    BEGIN
    INSERT INTO WMCDDL(USERNAME, DATETRIG, DDL_TYPE, OBJ_OWNER, OBJ_TYPE, OBJ_NAME, SRC)
    SELECT ora_login_user, SYSDATE, ora_sysevent, ora_dict_obj_owner, ora_dict_obj_type, ora_dict_obj_name, text 
    FROM all_source
    WHERE NAME=ora_dict_obj_name
    AND owner=ora_dict_obj_owner
    AND TYPE = ora_dict_obj_type;
    END;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre régulier Avatar de Vince7-7
    Homme Profil pro
    Fondateur et dirigeant de la société Oramatica. http://www.oramatica.com
    Inscrit en
    Janvier 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Fondateur et dirigeant de la société Oramatica. http://www.oramatica.com

    Informations forums :
    Inscription : Janvier 2007
    Messages : 125
    Points : 85
    Points
    85
    Par défaut
    Bonjour et merci de cette réponse. Je teste ça dès lundi et je reviens vers toi pour te donner des nouvelles. Je pense que mon erreur vient du fait que je faisais un trigger BEFORE DDL.
    Fondateur et dirigeant de la société Oramatica. Spécialiste du traitement de vos données.
    http://www.oramatica.com

  4. #4
    Membre régulier Avatar de Vince7-7
    Homme Profil pro
    Fondateur et dirigeant de la société Oramatica. http://www.oramatica.com
    Inscrit en
    Janvier 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Fondateur et dirigeant de la société Oramatica. http://www.oramatica.com

    Informations forums :
    Inscription : Janvier 2007
    Messages : 125
    Points : 85
    Points
    85
    Par défaut
    Bonjour.
    Non ça ne marche pas. Mon trigger est créé sous SYSTEM et ne récupère pas les données dans ALL_SOURCE. J'ai essayé un AFTER DDL ON SCHEMA, AFTER CREATE Or ALTER ON SCHEMA, AFTER DDL ON DATABASE et aucun ne passe.
    cette requête me retourn 0:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT count(1)
            into ln_vers
            FROM all_source
            WHERE NAME=ora_dict_obj_name
            AND owner=ora_dict_obj_owner
            AND TYPE = ora_dict_obj_type;
     
    raise_application_error(-20001,ln_vers);
    Le code de mon trigger est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    26
    CREATE OR REPLACE TRIGGER SYSTEM.ON_DDL_CODE_HI
        AFTER CREATE OR REPLACE ON DATABASE
    declare
      lv_user varchar2(100);
      lv_prog varchar2(100);
      lc_text clob;  
      ln_vers number:=0;
    BEGIN  
     
        if ora_dict_obj_type in ('PROCEDURE','FUNCTION','PACKAGE BODY','PACKAGE','VIEW') then 
     
            insert into backup.bck_code
            (NOM 
            ,type_code
            ,date_comp
            ,text 
            ,nom_dev)
            SELECT ora_dict_obj_name,ora_dict_obj_type,SYSDATE, text,ora_login_user
            FROM all_source
            WHERE NAME=ora_dict_obj_name
            AND owner=ora_dict_obj_owner
            AND TYPE = ora_dict_obj_type;
     
     
        end if;        
    END;
    Fondateur et dirigeant de la société Oramatica. Spécialiste du traitement de vos données.
    http://www.oramatica.com

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    j'ai testé.. en fait quand le trigger DDL est exécuté, le dictionnaire n'est pas encore mis à jour (pas commité).
    Donc tu ne peux pas lire all_source sur un CREATE.
    Sur un DROP, c'est bon.

    PS : Sur ma base 11.2.0.3, le REPLACE me sort une erreur ORA-04072: invalid TRIGGER TYPE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AFTER CREATE OR REPLACE ON DATABASE
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Quelque chose comme dans l'exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    create table mni.ddl_log
    (
        owner       varchar2(30),
        log_date    date,
        object_name varchar2(30),
        object_type varchar2(30),
        action      varchar2(10),
        sql_text    Clob
    );
    --
    create or replace trigger ac_db
    After Create On Database
    Declare
      sql_text DBMS_STANDARD.ora_name_list_t;
      n        PLS_INTEGER;
      l_stmt   Clob := Empty_Clob();
    Begin
      --
      n := ora_sql_txt(sql_text);
      For i In 1..n Loop
        l_stmt := l_stmt || sql_text(i);
      End Loop;
      --
      Insert Into mni.ddl_log
             (
              owner,
              log_date,
              object_name,
              object_type,
              action,
              sql_text
             )
             Values
             (
              ora_dict_obj_owner,
              sysdate,
              ora_dict_obj_name,
              ora_dict_obj_type,
              ora_sysevent,
              l_stmt
             );
    End;
    /

  7. #7
    Membre régulier Avatar de Vince7-7
    Homme Profil pro
    Fondateur et dirigeant de la société Oramatica. http://www.oramatica.com
    Inscrit en
    Janvier 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Fondateur et dirigeant de la société Oramatica. http://www.oramatica.com

    Informations forums :
    Inscription : Janvier 2007
    Messages : 125
    Points : 85
    Points
    85
    Par défaut
    Mon problème est résolu avec la solution de Mnuti. Un grand merci pour votre aide.
    Fondateur et dirigeant de la société Oramatica. Spécialiste du traitement de vos données.
    http://www.oramatica.com

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. All_source et Triggers
    Par adiltyane dans le forum SQL
    Réponses: 1
    Dernier message: 09/12/2008, 09h26
  2. [SQL2K5]Trigger DDL pour tracer DML utilisateur
    Par elsuket dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 13/09/2007, 05h43
  3. [SQLK][Trigger DDL]Ne pas montrer de message d'erreur
    Par elsuket dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 10/08/2007, 07h53
  4. [SQL Server 2005]Trigger DDL -> Nom Table Modifiée
    Par Yotho dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/06/2007, 11h11
  5. [9i] Trigger DDL
    Par denisC dans le forum Oracle
    Réponses: 5
    Dernier message: 04/12/2006, 14h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo