如何编写sql语句来恢复11g oracle数据库用户的密码

时间:2012-03-27 19:47:39

标签: database oracle

在Oracle 11g中,我知道我可以执行以下操作:

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');

错误

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中的每个用户执行此dba_users操作。

非常感谢!

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分: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;
但是,我会担心任何改变数据库中每个用户密码的事情。这是非常不寻常的,有充分的理由改变个人用户的密码,做一些事情,然后在不知道原始密码的情况下将其更改回去。我很难想象需要对几十个账户做这件事。