2012-04-25 95 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