我想结合以下两个陈述:
select password from sys.user$ where name='SYSMAN';
alter user SYSMAN identified by values '7A0F2B316C212D32';
当然,'7A0F2B316C212D32'是从第一个语句中获得的结果。一般来说,给定一个像'SYSMAN'这样的字符串,如何在一个笔画中实现这两个语句?
非常感谢!
答案 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';
取决于你想要获得多少花哨,如果你需要生成很多这样的语句,你可以将输出假脱机到一个文件,然后让你的脚本调用生成的脚本等。有很多选项
希望有所帮助。