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 :

trigger sur package pl


Sujet :

PL/SQL Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut trigger sur package pl
    Bonjour a tous
    je voulais savoir s'il est possible de creer un trigger qui se declenche lorsque un package PL/SQL est crée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE [OR REPLACE] PACKAGE package_name
    le corps du trigger serait de donner un grant a l'utilisateur qui se servira du package et aussi de creer un synomyme du package..Tout ceci est faisable?

    J'ai jamais ecrit un trigger donc je me lance avec ce super pas beau pseudo code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     CREATE TRIGGER grant_user_plus_synomyme
     AFTER
     la je sais pas comment lui dire:
     CREATE PACKAGE avec son nom?
     
     BEGIN
    	grant lePrivilege a l'utilisateur;
        create synomyme;
     END IF;
     END;
    Voila c'est l'idée
    qq'un sait faire ca?
    D'avance merci

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 21
    Par défaut Définition d’un déclencheur
    Bonjour,
    La définition d’un déclencheur:
    Un déclencheur de base de données est un ensemble d’instructions qui s’exécutent lorsque le contenu d’une table est modifié par l’intermédiaire d’une instruction INSERT, UPDATE ou DELETE.
    donc je pense, on ne peut pas définir un déclencheur au niveau d'un package

    Salutations ,
    khalid



    Citation Envoyé par ldiaz Voir le message
    Bonjour a tous
    je voulais savoir s'il est possible de creer un trigger qui se declenche lorsque un package PL/SQL est crée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE [OR REPLACE] PACKAGE package_name
    le corps du trigger serait de donner un grant a l'utilisateur qui se servira du package et aussi de creer un synomyme du package..Tout ceci est faisable?

    J'ai jamais ecrit un trigger donc je me lance avec ce super pas beau pseudo code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     CREATE TRIGGER grant_user_plus_synomyme
     AFTER
     la je sais pas comment lui dire:
     CREATE PACKAGE avec son nom?
     
     BEGIN
    	grant lePrivilege a l'utilisateur;
        create synomyme;
     END IF;
     END;
    Voila c'est l'idée
    qq'un sait faire ca?
    D'avance merci

  3. #3
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Citation Envoyé par khalid_montreal Voir le message
    Un déclencheur de base de données est un ensemble d’instructions qui s’exécutent lorsque le contenu d’une table est modifié par l’intermédiaire d’une instruction INSERT, UPDATE ou DELETE.
    Cette définition est incomplète, au moins en ce qui concerne Oracle. On peut créer des triggers sur des évènements DML (INSERT, UPDATE ou DELETE), mais également des évènements de base (LOGON par ex.) ou des évènements DDL.
    Voir ici pour le détail de la syntaxe :http://download.oracle.com/docs/cd/B...htm#sthref7885

    Dans ton cas, la syntaxe ressemblerait à l'exemple de la doc :
    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

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut trigger sur package pl
    Bonjour
    super...ok j'ai vu dans la doc le paragraphe qui parle de ca, donc dans ce cas, le trigger se declencherais chaque fois qu'un objet est crée avec CREATE sur un schema en particulier,
    le code serait just de donner les grant... ok
    Alors il me vient une autre question.

    Pour faire un grant la sintaxe etant:
    grant execute on object to user;

    De ce code je connais le user qui dans ce cas est toujours le meme, mais
    j'ai aussi besoins de recuperer le nom du package de façon dynamique, c'est possible ca?
    D'avance merci

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut trigger sur package pl/sql
    re moi

    j'ai vu ceci en cherchant un peu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'execute immediate "grant select on ' ||
                                         ora_dict_obj_name ||
                                        ' to scott";'
    ca voudrais dire que implicitement lorsque le trigger se declenche, la variable
    ora_dict_obj_name contient le nom du package? tiens je vais tester avec un output juste pour voir.

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut trigger sur pacakge pl/sql
    Yooo
    ca marche
    avec ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TRIGGER audit_db_object AFTER CREATE
       ON MONSCHEMA.SCHEMA
          BEGIN
          dbms_output.put_line(ora_dict_obj_name);
    	  END;
    lorsque je cre un package PL/SQL avec create or replace, ca m'a imprimé le nom du package que j'ai crée...Donc si dans le code je met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grant execute on ora_dict_obj_name to user;
    ca devrait suffir n'est ce pas?

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut trigger su package pl/sql
    J'ai essayé avec ca, mais j'ai une erreur,,,peu etre qqu'un peu me guider:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TRIGGER TRIGGER_GRANT AFTER CREATE
       ON MONSCHEMA.SCHEMA
       BEGIN
        'execute immediate "grant execute on ' ||ora_dict_obj_name ||' to user";';
       END;
    L'erreur est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    09:58:17 Error: 2/44    PLS-00103: Encountered the symbol "|" when expecting one of the following:
              := . ( @ % ;
    3/4     PLS-00103: Encountered the symbol "END"

  8. #8
    Expert confirmé 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

  9. #9
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut trigger sur package pl/sql
    Bonjour

    ok alors maintenant j'ai ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE TRIGGER TRI_RHUTST_GRANT AFTER CREATE 
       ON RHUTST.SCHEMA
    DECLARE 
       LC$Requete  VARCHAR2(256) ; 
       BEGIN 
       LC$Requete:= 'GRANT EXECUTE ON '||ora_dict_obj_name||' TO rhutst'; 
       EXECUTE IMMEDIATE LC$Requete; 
       END;
    /
    Ce trigger se compil bien sans erreur.
    Mais lorsque je cré un package pl quelquonque sur la base j'ai cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ORA-00604: error occurred at recursive SQL level 1
    ORA-30511: invalid DDL operation in system triggers
    ORA-06512: at line 5
    L'erreur decrite pas metalink:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Cause:	An attempt was made to perform an invalid DDL operation in a system 
    	trigger. Most DDL operations currently are not supported in system 
    	triggers. The only currently supported DDL operations are table 
    	operations and ALTER?COMPILE operations. 
    Action:	Remove invalid DDL operations in system triggers.
    Ca veut dire que le package en lui meme colle pas? serait ce a cause du REPLACE?

    Voici le debut du code du package:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE OR REPLACE PACKAGE Pkg_Rhuacoaccion AS

  10. #10
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Ca semble dire que tu n'as pas le droit de faire un GRANT directement dans ton trigger. Je crains que tu ne doives trouver une autre solution.

  11. #11
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut grant impossible dans trigger
    Mmmm c'est dommage ca.
    Et appeler une procedure dans un trigger c'est possible? Une procedure qui ferait un grant par exemple?

  12. #12
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Le problème est que les ordres DDL font un Commit implicite, ce qui est problématique dans un trigger.

    Tu peux essayer, mais dans ce cas je pense que la seule chance pour que ça marche est que ta proc possède le pragma AUTONOMOUS_TRANSACTION pour qu'il fasse ça dans une "sous-session". Et même là, pas de garantie.

    Sinon, que l'utilisation de jobs est peut-être une piste à creuser...

  13. #13
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Dans ce cas, tu peux :
    1. creer une procedure stockee avec ton execute immediate prenant en parametre d'entree le nom de ta proc
    2. dans ton trigger, creer un job (executer immediatement et une seule fois) en submittant ta proc du point 1 avec le nom de ta proc sur lequel tu veux faire le grant.

    De plus, il te faudra tester dans le trigger si l'action CREATE porte bien sur une procedure.

    Nicolas.

  14. #14
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut trigger et grant
    Salut,
    j'ai trouvé cette note metalink, ca cause de table, mais je suppose que ca peut se faire aussi avec un package:
    210693.1

  15. #15
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut trigger et grant
    Salut
    pardon j'avais pas vu ton post...oui voila la note metalink correspond a ce que tu dit.
    Je vais essayer.
    Merci a tous

  16. #16
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut grant auto avec trigger
    Salut a tous,
    bon je confirme ca marche bien.
    J'ai donc un trigger qui se declanche lorsque un ordre "CREATE" combiné avec PACKAGE est detecté...Ce trigger execute un job et le job en question est une procedure qui fait le grant.
    Donc la note metalink en question c'est ca la solution.
    Ciao et merci des contributions..

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

Discussions similaires

  1. trigger sur deux tables
    Par Shabata dans le forum Développement
    Réponses: 4
    Dernier message: 04/05/2004, 17h55
  2. triggers sur plusieurs bases de données
    Par Shabata dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/05/2004, 11h02
  3. Trigger sur une colonne ?
    Par hpalpha dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 15h16
  4. Trigger sur select
    Par bilo2000 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 02/02/2004, 14h39
  5. Pb Trigger sur vue
    Par cosminutza dans le forum Développement
    Réponses: 3
    Dernier message: 28/07/2003, 17h37

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