Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/12/2011, 09h25   #1
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 109
Points : 33
Points : 33
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 :
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
Moostiq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 10h45   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
Quel est le problème ?
Si l'interval est null alors le job ne s'exécutera qu'une seule fois.
Code :
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.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 10h50   #3
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 109
Points : 33
Points : 33
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 :
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 ???
Moostiq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 10h54   #4
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 109
Points : 33
Points : 33
En fait j'ai l'impression que l'ALTER USER IDENTIFIED BY rappelle le trigger ON LOGON DATABASE ...
Moostiq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 11h28   #5
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 109
Points : 33
Points : 33
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 !
Moostiq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 11h30   #6
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 109
Points : 33
Points : 33
Le truc incroyable est que le job est rappelé toutes les 5 secondes pile poil !

Any help ?
Moostiq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 11h51   #7
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 109
Points : 33
Points : 33
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 :
IF sys_context('USERENV', 'BG_JOB_ID') IS NULL THEN ...
Et là le job s'execute qu'une seule fois.

Bonne journée
Moostiq est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h05.


 
 
 
 
Partenaires

Hébergement Web