2012-03-27 6 views
1

In Oracle 11g wiederherzustellen, ich weiß, ich folgendes tun:Wie SQL-Anweisung schreiben 11g Oracle-Datenbank Benutzerkennwort

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

und ich

tun können, dann
'S:06A5CA37447558898739F8475FB32C4E4267AD4615F93BD3443028FDB8D6' 

bekommen
alter user BOB identified by values 'S:06A5CA37447558898739F8475FB32C4E4267AD4615F93BD3443028FDB8D6' 

, um das Passwort wiederherzustellen. Wie kann ich sie zusammen kombinieren, wird das folgende nicht funktionieren?

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

mit dem Fehler

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

Auch, wie den Benutzernamen vermeiden eingeben (hier BOB) zweimal? Idealerweise möchte ich diese alter Operation für jeden Benutzer in dba_users tun.

Vielen Dank!

Antwort

0

Man könnte sicherlich ein wenig 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; 

Ich wäre eher besorgt, aber über alles schreiben, das Passwort für jeden Benutzer in der Datenbank geändert. Es ist ungewöhnlich genug, dass es einen guten Grund gibt, das Passwort eines einzelnen Benutzers zu ändern, etwas zu tun und es dann wieder zu ändern, ohne jemals das ursprüngliche Passwort zu kennen. Ich kann mir nicht vorstellen, dass ich das für Dutzende von Accounts tun muss.

2

würde ich eine kurze PL/SQL-Skript schreiben, es zu tun:

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

Thank you! Es ist großartig. Ich frage mich nur, ob Sie wissen, warum der Benutzer 'ANONYMOUS' nicht funktioniert, da' reserver4' leer ist. Wie ändert man das Skript, um diesen Eckfall zu berücksichtigen? –

+0

Sie können ANONYMOUS in der SELECT-Anweisung ausschließen, die die Schleife antreibt. Antwort aktualisiert – DCookie

+0

Sicher. Aber ich brauche "ANONYMOUS", weil es auch abgelaufen ist. Wie kann ich das machen? –