如何写sql语句恢复11g oracle数据库用户密码
Posted
技术标签:
【中文标题】如何写sql语句恢复11g oracle数据库用户密码【英文标题】:How to write sql statement to restore 11g oracle database user's password 【发布时间】:2012-03-27 19:47:38 【问题描述】:在 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)?理想情况下,我想为dba_users
中的每个用户执行此alter
操作。
非常感谢!
【问题讨论】:
【参考方案1】:我会编写一个简短的 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.
【讨论】:
谢谢!太好了。只是想知道您是否知道为什么用户ANONYMOUS
,因为它的spare4
是空的,所以它不起作用。如何修改脚本以解决这种极端情况?
您可以在驱动循环的 SELECT 语句中排除 ANONYMOUS。答案已更新。
当然。但我需要未过期的ANONYMOUS
,因为它目前也已过期。我该怎么做?
在运行脚本之前更改或设置 ANONYMOUS 的密码以使密码过期。然后你也可以删除脚本中的 WHERE 子句。
真的很抱歉。但是如何不留下ANONYMOUS
的密码呢? alter user ANONYMOUS identified by values '';
不起作用,出现错误 ORA-00600: internal error code, arguments: [kzsviver:1], [], [], [], [], [], [], [], [], [], [], []
【参考方案2】:
你当然可以写一点 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;
不过,我更担心会更改数据库中每个用户的密码的任何事情。有充分的理由更改单个用户的密码,做某事,然后在不知道原始密码的情况下将其更改回来,这已经很不寻常了。我很难想象需要对几十个帐户这样做。
【讨论】:
以上是关于如何写sql语句恢复11g oracle数据库用户密码的主要内容,如果未能解决你的问题,请参考以下文章