2011-11-01 4 views
1

je veux combiner les deux déclarations suivantes:base de données Oracle comment combiner les deux déclarations

select password from sys.user$ where name='SYSMAN'; 
alter user SYSMAN identified by values '7A0F2B316C212D32'; 

Bien sûr, « 7A0F2B316C212D32 » est le résultat obtenu à partir de la première déclaration. En général, étant donné une chaîne comme 'SYSMAN', comment réaliser les deux instructions en un seul coup?

Merci beaucoup!

Répondre

1

Malheureusement, Oracle ne permet pas:

ALTER USER SYSMAN IDENTIFIED BY VALUES (SELECT password FROM sys.user$ WHERE name='SYSMAN') 

donc votre seul choix semblerait être PL/SQL. Vous pouvez probablement mettre cela dans une procédure, puis l'appeler (je suppose avec des paramètres pour la source & utilisateurs de destination).

Voici comment le faire dans une procédure stockée:

CREATE OR REPLACE PROCEDURE move_password (
source_user IN varchar2, 
dest_user IN varchar2 
) 
IS 
    pass varchar(30); 
BEGIN 
    select password into pass from sys.user$ where name=source_user; 
    execute immediate 'alter user '||dest_user||' identified by values ''' || pass || ''''; 
END; 

Bien que, quand je le tester, le déplacement passe entre les utilisateurs comme cela ne fonctionne pas vraiment. Au moins en 10g. N'a pas testé 11. Apparemment, dans 10g, le hash de mot de passe inclut le nom d'utilisateur (11 est différent, cela peut fonctionner). Il y a quelques third-party documentation of the password algorithm.

Bien sûr, étant donné que cela inclut SQL dynamique, vous devez vous méfier de la citation, qui n'est pas traitée dans ce qui précède. On suppose que seul sysdba sera autorisé à appeler cette procédure, donc ...

+0

merci pour l'info. Cela vous dérange-t-il de fournir la procédure PL/SQL? –

+0

@QiangLi: J'ai mis à jour ma réponse avec une procédure stockée pour le faire. – derobert

0

L'autre option est SQL générant SQL.

Quelque chose comme cela devrait vous donner l'idée:

select 'alter user '||name||' identified by values '||chr(39)||password||chr(39)||';' from sys.user$ where name = 'SYSMAN'; 

Cela va générer l'instruction utilisateur alter vous besoin:

alter user SYSMAN identified by values '7A0F2B316C212D32'; 

Selon la façon dont vous avez envie voulez obtenir, et si vous avez besoin Pour générer un grand nombre d'instructions de ce type, vous pouvez spouler la sortie dans un fichier, puis demander à votre script d'appeler le script généré, etc. Il y a beaucoup d'options.

Espérons que ça aide.

+0

Oh génial. Mais existe-t-il un moyen direct d'exécuter le sql généré autre que d'écrire dans un fichier puis de l'exécuter? –

+0

@QiangLi: Vous pouvez utiliser PL/SQL en ligne, en l'enveloppant dans un bloc 'begin' /' end' et en utilisant 'execute immediate'. Mais bien sûr, c'est plus ou moins ce que j'ai fait ... – derobert

+0

juste, j'ai oublié ça. :) –

Questions connexes