oracle数据库如何结合这两个语句

时间:2011-11-01 20:07:50

标签: sql oracle

我想结合以下两个陈述:

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

当然,'7A0F2B316C212D32'是从第一个语句中获得的结果。一般来说,给定一个像'SYSMAN'这样的字符串,如何在一个笔画中实现这两个语句?

非常感谢!

2 个答案:

答案 0 :(得分:1)

不幸的是,Oracle不允许这样做:

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

所以你唯一的选择似乎是PL / SQL。你可以把它放在一个程序中,然后调用它(我假设有源和目标用户的参数)。

以下是如何在存储过程中执行此操作:

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;

但是,当我测试它时,在这样的用户之间移动密码实际上并不起作用。至少在10克。没有测试11.显然,在10g中,密码哈希包含用户名(11不同,它可能有效)。有一些third-party documentation of the password algorithm

当然,由于这包括动态SQL,你必须警惕引用 - 这在上面没有处理。可能只允许sysdba调用此过程,所以......

答案 1 :(得分:0)

另一个选项是SQL生成SQL。

这样的事情会给你一个想法:

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

这将生成您需要的alter user语句:

alter user SYSMAN identified by values '7A0F2B316C212D32';

取决于你想要获得多少花哨,如果你需要生成很多这样的语句,你可以将输出假脱机到一个文件,然后让你的脚本调用生成的脚本等。有很多选项

希望有所帮助。