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

Oracle Discussion :

Table Sys Obj$ et Trigger


Sujet :

Oracle

  1. #1
    Membre averti
    Inscrit en
    Février 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 18
    Par défaut Table Sys Obj$ et Trigger
    Bonjour

    J'essaie de detecter/tracer les creations/suppressions de tables et/ou attributs au sein d'une BD (en l'occurence Oracle pour commencer).
    Par example je veux savoir les tables et attributs qui ont été créée par SCOTT et sachant cette information je doit declencher un évènement quelconque.

    Le problem c'est qu'apparement les seul triggers possibles sur les vues (user_tables pour celle qui me concerne) sont des 'instead of' alors que je voudrais un 'after'.

    Donc ayant les droits administrateur sur ma base j'ai ete voir le code de cration de la vue user_tables.
    Apparement les donnees de la vue user_tables sont issues, en partie, de la table obj$ appartenant à SYS (ca tombe bien c'est moi).

    Donc j'ai fais un trigger

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create trigger update_scott_table_list
    after insert on obj$
    for each row
     begin
     if owner#=59 || type#=2
     insert into scott.table_list values (:new.name);
    end;
    où owner#= 59 correspond à SCOTT et type#=2 correspond à une TABLE
    scott.table_list une table que j'ai crée contenant le nom de la table

    Sauf que Oracle me dit ORA-04089 cannot create triggers on objects owned by SYS

    Ma question est il possible de contourner Ora-04089 si oui comment pourrais je faire sinon comment pourrais je faire pour mettre à jour ma table table_list quand une table est créée ?

    Encore une fois un grand merci pour votre aide.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 138
    Par défaut
    Personnellement, je trouve ta solution TRÈS douteuse. Il n'est pas conseillé et avec raison de modifier ou créer quoi que ce soit dans le schéma SYS, et encore moins des traitements qui peuvent modifier ou rendre inopérant certaines actions natives de la base de données.

    Un database trigger devrait faire l'affaire. Tu peux définir un trigger dans un schéma pour capter le DDL par exemple

  3. #3
    Membre averti
    Inscrit en
    Février 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 18
    Par défaut
    euh

    Pourrais tu etre plus precis sur :
    Un database trigger devrait faire l'affaire. Tu peux définir un trigger dans un schéma pour capter le DDL par exemple
    Apart créer un trigger dans le schema sys je ne vois pas du tout comment tu peux faire pour capter un ajout de table dans le schema scott.
    Dans la mesure où la seule vue qui te permet de connaitre les tables appartenant à l'utilisateur concerné est user_table et créer un trigger sur une vue, et a priori, pas possible.
    Donc je remonte à la source qui a servi pour la creation de la vue: la table Obj$ apartenant à Sys.

  4. #4
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Par défaut
    Bonjour ,

    eviter cette solution plutôt fumeuse et trés peu recommendé par Oracle
    Sinon concernant votre problématique vous avez deux solutions :

    - Trigger avec l'évènement CREATE
    - Audit

    Bon courage

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 138
    Par défaut
    Justement, l'idée est d'éviter de remonter à la source ainsi et de créer un trigger sur un ÉVÈNEMENT DDL. Il ne faut pas oublier non plus qu'ORACLE travaille constamment dans le dictionnaire de données. Un trigger sur une de ces tables pourrait capter beaucoup plus d'opérations que prévu et ainsi causer un workload non désiré.

    Exemple sur la création; trigger sur un schéma uniquement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TRIGGER audit_db_object AFTER CREATE
    ON SCHEMA
    pl/sql_block
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE TRIGGER drop_trigger
    BEFORE DROP ON hr.SCHEMA
    BEGIN
    CREATE TRIGGER
    SQL Statements: CREATE SYNONYM to CREATE TRIGGER 16-115
    RAISE_APPLICATION_ERROR (
    num => -20000,
    msg => 'Cannot drop object');
    END;
    C'est plus dans les règles de l'art...

  6. #6
    Membre averti
    Inscrit en
    Février 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 18
    Par défaut
    Ok merci beaucoup
    Je vais approfondir ces pistes

Discussions similaires

  1. Problème de Table mutante sur un trigger
    Par mouad83 dans le forum SQL
    Réponses: 2
    Dernier message: 15/05/2009, 16h25
  2. C'est quoi le rôle de la table SYS.DUAL
    Par commit dans le forum Débuter
    Réponses: 1
    Dernier message: 12/10/2008, 21h24
  3. Définition des tables sys.v$...
    Par poc dans le forum Oracle
    Réponses: 2
    Dernier message: 22/02/2006, 15h46
  4. tables sys + stockage des contraintes
    Par XtofRoland dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 31/01/2006, 09h39
  5. Réponses: 11
    Dernier message: 20/12/2005, 18h40

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