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

SQL Oracle Discussion :

Executer job une seule fois ?


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Points : 119
    Points
    119
    Par défaut Executer job une seule fois ?
    Bonjour;


    J'aimerais savoir comment exécuter une seule fois un job par la commande isubmit ? Sachant que mon job à exécuter est dans un trigger after logon database.

    Voici l'appel de création du job en question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     v_job:=12345;
    -- execution apres 1 seconde 
      dbms_job.isubmit(v_job, 'EXECUTE_ALTER_USER(''' || v_ddl_cmd || ''');', sysdate+(1/24/60/60));
    Merci beaucoup de votre savoir

  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
    Quel est le problème ?
    Si l'interval est null alors le job ne s'exécutera qu'une seule fois.
    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
    -- Parameters are:
      --
      -- JOB is the number of the job being executed.
      -- WHAT is the PL/SQL procedure to execute.
      --   The job must always be a single call to a procedure.  The
      --     routine may take any number of hardcoded parameters.
      --     Special parameter values recognized are:
      --       job:       an in parameter, the number of the current job
      --       next_date: in/out, the date of the next refresh
      --       broken:    in/out, is the job broken.  The IN values is FALSE.
      --   Always remember the trailing semicolon.
      --   Some legal values of WHAT (assuming the routines exist) are
      --     'myproc( ''10-JAN-82'', next_date, broken);'
      --     'scott.emppackage.give_raise( ''JENKINS'', 30000.00);'
      --     'dbms_job.remove( job);'
      -- NEXT_DATE is the date at which the job will next be automatically run,
      --   assuming there are background processes attempting to run it.
      -- INTERVAL is a date function, evaluated immediately before the job starts
      --   executing.  If the job completes successfully, this new date is placed
      --   in NEXT_DATE.  INTERVAL is evaluated by plugging it into the statement
      --     select INTERVAL into next_date from dual;
      --   INTERVAL must evaluate to a time in the future.  Legal intervals include
      --     'sysdate + 7'                    -- execute once a week
      --     'NEXT_DAY(sysdate,''TUESDAY'')'  -- execute once every tuesday
      --     'null'                           -- only execute once
      --   If INTERVAL evaluates to null and a job completes successfully, then
      --   the job is automatically deleted from the queue.
     
      PROCEDURE isubmit    ( job       IN  BINARY_INTEGER,
                             what      IN  VARCHAR2,
                             next_date IN  DATE,
                             interval  IN  VARCHAR2 DEFAULT 'null',
                             no_parse  IN  BOOLEAN DEFAULT FALSE);
      -- Submit a new job with a given job number.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Points : 119
    Points
    119
    Par défaut
    Bonjour Mcm,
    Voici mon code pour etre plus clair.

    Ce code a pour but de modifier automatiquement le mot de passe d'un user qui vient tous juste de ce logger sur la database. En clair; émuler du One Time Password.

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    create or replace
    TRIGGER TRG_LOG_ON 
    AFTER LOGON ON DATABASE
    DECLARE
      v_old_passwd VARCHAR2(30);
    	v_new_passwd VARCHAR2(30):='';
    	v_username sys.v_$session.USERNAME%TYPE;
    	v_date_connexion sys.v_$session.LOGON_TIME%TYPE;
    	Err_username EXCEPTION;
      Err_date_cnx EXCEPTION;
      Err_old_passwd EXCEPTION;
      Err_new_passwd EXCEPTION;
    	L_Requete varchar2(180);
      v_ddl_cmd varchar2(4000);
      v_job   number:=null;
    BEGIN
      IF REGEXP_LIKE(USER,'^USER[0-9]{3}$') THEN
      L_Requete:='SELECT USERNAME, logon_time FROM sys.v_$session
      WHERE REGEXP_LIKE (USERNAME, ''^USER[0-9]{3}$'') AND ROWNUM = 1 ORDER BY logon_time ASC';
      Execute immediate L_Requete INTO v_username ,v_date_connexion;  
      if v_username is null then
      raise Err_username;
      end if;
    	if v_date_connexion is null then 
      raise Err_date_cnx;
      end if;
     
      L_Requete:='SELECT UTO_PWD_GPL FROM UTILISATEUR_ORA WHERE UTO_USR_NAME=:a';
      Execute immediate L_Requete into v_old_passwd using v_username;
      if v_old_passwd is null then 
      raise Err_old_passwd;
      end if;
     
      v_new_passwd:=CreateRandomPassword();
      if v_new_passwd is null then 
      raise Err_new_passwd;
      end if;
     
      -- stored procedure to execute the DDL statements(in background)
      v_ddl_cmd:='ALTER USER '||v_username||' IDENTIFIED BY '||v_new_passwd||'';
      dbms_job.submit(job =>v_job,what =>  'EXECUTE_ALTER_USER(''' || v_ddl_cmd || ''');',next_date =>  sysdate, interval =>  null);
     
      L_Requete:='UPDATE UTILISATEUR_ORA SET UTO_PWD_GPL=:a, UTO_DATE_STATUT=:b WHERE UTO_USR_GPL=:c';
      Execute immediate L_Requete using v_new_passwd, v_date_connexion, v_username;
     
     	COMMIT;
      END IF;
    EXCEPTION
    	WHEN Err_username THEN PKG_COM.Ecrire_trace(PKG_COM.ERR,Substr(Sqlerrm || ': ' || L_Requete, 1, 200),'La lecture de USERNAME '||v_username||' a echoue',' ','TRG_LOG_ON');
    	WHEN Err_date_cnx THEN PKG_COM.Ecrire_trace(PKG_COM.ERR,Substr(Sqlerrm || ': ' || L_Requete, 1, 200),'La lecture de logon_time '||v_date_connexion ||' a echoue',' ','TRG_LOG_ON');
    	WHEN Err_old_passwd THEN PKG_COM.Ecrire_trace(PKG_COM.ERR,Substr(Sqlerrm || ': ' || L_Requete, 1, 200),'La lecture de old passwd '||v_old_passwd ||' a echoue',' ','TRG_LOG_ON');
      WHEN Err_new_passwd THEN PKG_COM.Ecrire_trace(PKG_COM.ERR,Substr(Sqlerrm || ': ' || L_Requete, 1, 200),'La regeneration de New passwd '||v_old_passwd ||' a echoue',' ','TRG_LOG_ON');
      WHEN OTHERS THEN PKG_COM.Ecrire_trace(PKG_COM.ERR,Substr(Sqlerrm || ': ' || L_Requete, 1, 200),'Erreur OTHERS  '||v_username||' ??? new_pawd:*'||v_new_passwd||'*',' ','TRG_LOG_ON');
    END TRG_LOG_ON;
    Mais il effectue l'UPDATE dasn la table UTILISATEUR_ORA et l'ALTER USER IDENTIFIED BY (appel à la procedure stockée) un nombre infini de fois !

    Comment calmer tout ça et ne faire qu'une seule fois ce changement de mot de passe Oracle ainsi que l'update dans la table UTILISATEUR_ORA ???

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Points : 119
    Points
    119
    Par défaut
    En fait j'ai l'impression que l'ALTER USER IDENTIFIED BY rappelle le trigger ON LOGON DATABASE ...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Points : 119
    Points
    119
    Par défaut
    C'est bien ça le trigger est rappelé et crée un nouveau job qui recrée un nouveau de passe, puis le trigger est rappelé ainsi de suite !

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Points : 119
    Points
    119
    Par défaut
    Le truc incroyable est que le job est rappelé toutes les 5 secondes pile poil !

    Any help ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Points : 119
    Points
    119
    Par défaut
    Okay !
    Punaiz' alors en fait il faut rajouter le test pour savoir si le job de la session courante est en front ou background par le test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF sys_context('USERENV', 'BG_JOB_ID') is NULL THEN ...
    Et là le job s'execute qu'une seule fois.

    Bonne journée

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

Discussions similaires

  1. Ma requete s'execute qu'une seule fois dans mon curseur
    Par remyescof dans le forum Développement
    Réponses: 5
    Dernier message: 21/03/2008, 10h03
  2. Ma requete s'execute qu'une seule fois dans mon curseur
    Par remyescof dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 21/03/2008, 10h03
  3. Mon callback de dessinae ne s'execute qu'une seul fois
    Par pepsidrinker dans le forum GLUT
    Réponses: 4
    Dernier message: 22/11/2007, 17h46
  4. [DLL] Ma DLL execute le Timer une seul fois !
    Par TOTO32 dans le forum Langage
    Réponses: 14
    Dernier message: 13/08/2005, 21h37
  5. Réponses: 1
    Dernier message: 19/03/2005, 23h47

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