2011-11-01 38 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

對,只是忘了那個。 :) –

相關問題