2012-04-25 97 views
1

以下過程:立即執行ALTER USER綁定變量

create or replace 
PROCEDURE ChangePassword 
(
    p_Name  VARCHAR2, 
    p_Password VARCHAR2 
) 
AS 
    EXECUTE IMMEDIATE 'ALTER USER :a IDENTIFIED BY :b' USING p_Name, p_Password; 
END; 

編譯successfuly,但在執行時:

exec ChangePassword('TestUser', 'newPassword'); 

導致錯誤:

01935. 00000 - "missing user or role name" 
*Cause: A user or role name was expected. 
*Action: Specify a user or role name. 

爲什麼?

+1

AFAIK,你不能使用綁定的DDL語句,你能嗎? – 2012-04-25 13:32:58

回答

5

您不能使用綁定變量來代替標識符,例如此語句中的用戶名。解析語句時標識符的值需要知道,而解析後併入綁定值後才能執行。

3

我認爲,以下將工作

create or replace PROCEDURE ChangePassword(p_Name   IN VARCHAR2, 
              p_Old_password IN VARCHAR2, 
              p_New_password IN VARCHAR2) 
AS 
    EXECUTE IMMEDIATE 'ALTER USER ' || p_name || 
        ' IDENTIFIED BY ' || p_New_password || 
        ' REPLACE ' || p_Old_password; 
END; 

分享和享受。

+3

這樣做的工作,我試過了。問題是,它非常開放的SQL注入。有一些安全的方法來完成任務嗎? – Atif 2012-04-25 12:19:41

+1

您可以使用DBMS_ASSERT包來避免SQL注入。請參閱[鏈接](http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_assert.htm)。例如,您可以使用DBMS_ASSERT.ENQUOTE_NAME來確保用戶名和新舊密碼被正確處理爲名稱,並且DBMS_ASSERT.SCHEMA_NAME聲明用戶名是有效的。 – 2012-04-25 13:56:19