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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    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 confirmé

    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
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

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

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Any help ?

+ 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, 09h03
  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, 09h03
  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, 16h46
  4. [DLL] Ma DLL execute le Timer une seul fois !
    Par TOTO32 dans le forum Langage
    Réponses: 14
    Dernier message: 13/08/2005, 20h37
  5. Réponses: 1
    Dernier message: 19/03/2005, 22h47

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