2012-03-27 6 views
1

を復元するためにSQL文を書くためにどのように、私は次の操作を行うことができます知っている:のOracle 11gでは11グラムのOracleデータベースのユーザーのパスワード

select spare4 from user$ where name='BOB'; 

'S:06A5CA37447558898739F8475FB32C4E4267AD4615F93BD3443028FDB8D6' 

を得るそれから私は

を行うことができます
alter user BOB identified by values 'S:06A5CA37447558898739F8475FB32C4E4267AD4615F93BD3443028FDB8D6' 

パスワードを復元します。 どうすればこれらを組み合わせることができますか?以下は動作しません。

alter user BOB identified by values (select spare4 from user$ where name='BOB') 
            * 
ERROR at line 1: 
ORA-02153: invalid VALUES password string 

はまた、どのように二度ユーザ名(ここではBOB)を入力して回避するために、エラーと

alter user BOB identified by values (select spare4 from user$ where name='BOB'); 

?理想的には、dba_usersのすべてのユーザーに対してこれをalter操作で実行したいと考えています。

ありがとうございます!

答えて

0

は、あなたは確かに、データベース内のすべてのユーザーのパスワードを変更したものについては、しかし、私はむしろ心配になるPL/SQLのビット

DECLARE 
    l_sql_stmt VARCHAR2(1000); 
BEGIN 
    FOR u IN (SELECT * FROM user$) 
    LOOP 
    l_sql_stmt := 'ALTER USER ' || name || 
        ' IDENTIFIED BY VALUES ''' || 
        u.spare4 || 
        ''''; 
    EXECUTE IMMEDIATE l_sql_stmt; 
    END LOOP; 
END; 

を書くことができます。個々のユーザーのパスワードを変更して何かをした後、元のパスワードを知らなくても元のパスワードに戻すのが良い理由があるのは珍しいことです。私は数十のアカウントにそれをする必要があると想像するのは難しいです。

2

私はそれを行うには、短いPL/SQLスクリプトを記述します

DECLARE 
BEGIN 
    FOR R IN (SELECT 'ALTER USER '||name||' IDENTIFIED BY VALUES '''||spare4||'''' AS s FROM user$ WHERE name <> 'ANONYMOUS') LOOP 
    EXECUTE IMMEDIATE R.s; 
    END LOOP; 
END; 
/

You can't use a subquery in DDL.

+0

ありがとうございました!それは素晴らしいです。あなたが 'ANONYMOUS'ユーザの理由を知っているのであれば、' spare4'が空であるので動作しません。このコーナーケースを考慮してスクリプトを変更するにはどうすればよいですか? –

+0

ループを駆動するSELECTステートメントでANONYMOUSを除外できます。回答が更新されました。 – DCookie

+0

しかし、現在も期限が切れているので、 'ANONYMOUS'を期限切れにする必要があります。どうやってやるの? –