2011-11-01 41 views
1

我想下面的两个语句组合结合:oracle数据库如何将两个语句

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

当然,“7A0F2B316C212D32”从第一条语句得到的结果。一般来说,给定一个像'SYSMAN'这样的字符串,如何一次性实现这两个语句?

非常感谢!

回答

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

当然,由于这包括dyamic SQL,所以您必须警惕引用 - 这在上面没有处理。大概只有sysdba将被允许调用这个过程,所以...

+0

感谢您的信息。你介意提供PL/SQL过程吗? –

+0

@QiangLi:我已经用存储过程更新了我的答案。 – derobert

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

根据您想如何看上得到,如果你需要要生成很多这样的语句,可以将输出缓冲到文件中,然后让脚本调用生成的脚本等。有很多选项。

希望有所帮助。

+0

太好了。但有没有一种直接的方式来执行生成的SQL,而不是写入文件然后执行? –

+0

@QiangLi:你可以使用内联的PL/SQL,将它封装在一个'begin' /'end'块中并使用'execute immediate'。但当然,这或多或少是我做的... – derobert

+0

对,只是忘了那个。 :) –

相关问题