Bonjour à tous,
Comment puis-je faire pour qu'un script me génère l'export d'une base de
données ?
Par avance, merci.
[Modération, Orafrance : Titre modifié pour illustrer plus exactement la problèmatique]![]()
Bonjour à tous,
Comment puis-je faire pour qu'un script me génère l'export d'une base de
données ?
Par avance, merci.
[Modération, Orafrance : Titre modifié pour illustrer plus exactement la problèmatique]![]()
Et bien, il faut que votre script invoque l'utilitaire d'export (EXP)
ce qui sera particulièrement retor en PL/SQL puisqu'il faut développer une procédure java qui permet d'exécuter un exécutable sur le systéme![]()
OK, donc en faisant un script de ce type :
je pourrais évoquer de manière automatique l'export ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 BEGIN EXP system/manager OWNER=moi ... END ;
Sinon dans la section DECLARE du bloc PL/SQL, je définit plusieurs
variables, de manière à paramétrer mon export, comment pourrais-je
faire ensuite pour demander à l'utilisateur quelle base dois-je exporter ?
(en fait, je cherche l'instruction PL/SQL qui me permette de demander à
l'utilisateur de rentrer une valeur ...).
Par ailleurs, un script PL/SQL doit-il être enregistré sous avec l'extension .SQL ?
Par avance, merci beaucoup !
Bonjour,Envoyé par orafrance
Tu peux développer un peu plus, s'il te plait ?
Merci.
A mon avis, il serait beaucoup plus simple de faire cela en script OS (Bat ou shell) afin de générer le parfile et l'appel de l'export....![]()
Oui, ou de coder simplement l'appel de EXP dans un script Sql*lus avec la commande HOST() ou !
http://www.developpez.net/forums/viewtopic.php?t=180815
Mais je reste convaincu que le PL/SQL n'est pas fait pour éxécuter des programmes OS
à lire aussi : http://asktom.oracle.com/pls/ask/f?p=4950:8:8518670148420852553::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:952229840241
Avec DBMS_PIPE expliqué par Tom Kyte
Si tu as accés au support Metalink voila d'autres méthodes :
Dynamic SQL and System Commands Using DBMS_PIPE
Calling Operating System Commands from PL/SQL using External Procedures
Et pour être tout à fait complet, voila la doc Oracle :
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96612/d_pipe2.htm#1003387
OK, en fait dans ce cas de figure spécifique, l'utilisation du PL/SQL sera plus compliquée que de passer par un fichier batch ... ?
Si vous pouvez le faire par batch, à mon avis c'est préférable et plus simple à mettre en place, à comprendre et à maintenir...![]()
Bien sûr, c'est TOUJOURS plus difficile
Le PL/SQL n'a d'intérêt que pour éxécuter des taches spécifiques à Oracle et en aucun cas lancer des programmes divers.
Pour info j'ai testé ceci sous Unix :
Installation :
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 $ more host.csh #!/bin/csh -f sqlplus apps/apps <<"EOF" | grep '^#' | sed 's/^.//' > tmp.csh set serveroutput on declare status number; command varchar2(255); begin status := dbms_pipe.receive_message( 'HOST_PIPE' ); if ( status <> 0 ) then dbms_output.put_line( '#exit' ); else dbms_pipe.unpack_message( command ); dbms_output.put_line( '##!/bin/csh -f' ); dbms_output.put_line( '#' || command ); dbms_output.put_line( '#exec host.csh' ); end if; end; / spool off "EOF" chmod +x tmp.csh exec tmp.cshExecution :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 SQL> create or replace procedure host( cmd in varchar2 ) 2 as 3 status number; 4 begin 5 dbms_pipe.pack_message( cmd ); 6 status := dbms_pipe.send_message( 'HOST_PIPE' ); 7 if ( status <> 0 ) then raise_application_error( -20001, 'Pipe error' ); 8 end if; 9 end; 10 /
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 $ ./host.csh& [1] 1859672 $Résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SQL> exec host('touch ok.orafrance'); Procédure PL/SQL terminée avec succès. SQL> exec host('dir') Procédure PL/SQL terminée avec succès.
Sous linux :
tmp.csh: dir: introuvable.Donc, ça marche parfaitement bien
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3$ ls -ltr ok* -rw-r--r-- 1 oracle dba 0 01 fév 11:24 ok.orafrance
![]()
Merci beaucoup pour toutes ses précisions.
Je vais consulter les différents liens proposés et analyser le tout.
Merci encore.
Envoyé par orafrance
JAMAIS je ne mettrais ça en place directement !!!
Parce que l'utilisateur (au sens Oracle) qui le lance a l'air (fort logiquement, d'ailleurs) de se retrouver en tant qu'utilisateur "oracle" sur le système UNIX, et donc membre du groupe DBA, ....
En environnement opérationnel, c'est plus que limite....
c'est clair que c'est TRES dangereux et que bien entendu, une telle manipulation nécessite de bien restreindre les droits d'exécution de la procedure HOST... en fait, c'est exactement pareil que pour UTL_FILE qui peut être TRES dangereux si une directory comme ORACLE_HOME est créée
Par ailleurs, j'en profite pour rappeller que le privilège ALTER ANY USER est aussi très dangereux puisqu'il permet de se connecter à n'importe quel compte (donc SYS ou SYSTEM) sans que personne puisse s'en rendre compte![]()
Bon les gars, à quand un petit papier sur les 10 règles d'or sur la sécurité ?
au moins celles qui permettent de ne pas être califfe à la place du califfe !
Partager