我创建了一个过程,如下所示。这个过程出现在schema1
中,并试图修改另一个模式/用户(比如schema2
(的密码。为了实现这一点,用户schema1
必须已经更改了用户权限,但由于应用程序级别的一些限制,我无法向schema1
提供alter user
权限。我尝试在过程中使用ALTER SESSION
进行查询,但它不起作用。有人能帮我解决这个问题吗?
代码:
Procedure p_demo(p_schema in varchar, p_pswd in varchar2)
is
begin
execute immediate 'alter session set current_schema ='||p_schema;
execute immediate 'alter user '||p_schema||' identified by '||p_pswd;
end;
更改current_schema
对权限或当前登录的用户没有影响。它只是更改对象名称解析的工作方式。如果在current_schema
设置为schema1
时查询对象foo
,Oracle将在schema1
模式中查找,而不是在当前用户的模式中查找。它不会让您访问schema1.foo
表。
我不太确定我是否理解这个目标。如果您试图确保只有schema2
用户可以更改schema2
用户的密码,则可以定义使用调用方权限而不是定义方权限的过程。
create or replace procedure change_my_password( p_username in varchar2,
p_password in varchar2 )
authid current_user
is
begin
execute immediate 'alter user '||p_username||' identified by '||p_password;
end;
/
如果目标是让程序归schema1
所有,并允许schema2
用户以外的用户更改schema2
的密码(即允许应用程序用户或帮助台用户重置用户的密码(,则schema1
可能需要alter user
权限。否则,这可能是不可行的。
如果你真的很绝望,你可能会使用未记录的(我在这里强调的是未记录的,随时可能更改,可能会有奇怪的副作用,可能会让Oracle支持部门不满意(dbms_sys_sql
包。这是APEX在内部使用的包,用于作为其他用户运行代码。我不认为一个理智的DBA会考虑给应用程序用户execute
访问该包的权限,而不是更安全的alter user
权限,但如果你试图绕过一些公司策略,而不太关心实际的安全性。。。
本例涉及3个用户:
scott
,试图更改他人的密码(这是您的schema1
(mike
,其密码应更改(您的schema2
(mydba
,他在我的数据库中被授予DBA角色(如果你没有这样的用户,SYS
可以,但是-你宁愿有自己的"DBA"用户,如果不必的话,不要惹SYS
(
连接为scott
,我无法修改mike
的密码:
SQL> alter user mike identified by lion;
alter user mike identified by lion
*
ERROR at line 1:
ORA-01031: insufficient privileges
我将以mydba
的身份连接,并创建一个类似于您的存储过程:
SQL> connect mydba/mypwd@c11gt
Connected.
SQL> create or replace procedure p_demo (p_schema in varchar2, p_pswd in varchar2) is
2 begin
3 execute immediate 'alter user ' || p_schema || ' identified by ' || p_pswd;
4 end;
5 /
Procedure created.
SQL> exec p_demo('mike', 'lion');
PL/SQL procedure successfully completed.
OK;它是有效的。我会将execute
权限授予scott
:
SQL> grant execute on p_demo to scott;
Grant succeeded.
返回scott
;看看他现在能做什么:
SQL> connect scott/tiger@c11gt
Connected.
SQL> exec mydba.p_demo('mike', 'friday');
PL/SQL procedure successfully completed.
mike
的凭据有效吗?
SQL> connect mike/friday@c11gt
Connected.
SQL>
是的,一切都很好。
所以:您不必将alter user
授予schema1
;让它使用特权用户拥有的过程,该特权用户可以更改其他人的密码。
我们不能如下所示:尝试过这样做,但没有成功。我想做的基本上是给一个角色赋予alter用户权限,并将该角色分配给我的oracle过程。创建角色role_name;将ALTER USER授予角色名称将role_name上的所有内容授予过程