从Oracle存储过程运行系统命令

时间:2017-01-26 22:42:58

标签: java oracle permissions

我正在尝试运行以下命令:

    select os_command.exec('/bin/mkdir /home/smucha/testdir_ora3') from dual;
/

当我以 SYS 登录时,此功能正常。

当我尝试以用户 SEBA 运行时,我收到以下错误:

ORA-29532: java.security.AccessControlException: the Permission (java.io.FilePermission /bin/mkdir execute) has not been granted to SEBA. The PL/SQL to grant this is dbms_java.grant_permission( 'SEBA', 'SYS:java.io.FilePermission', '/bin/mkdir', 'execute' )
ORA-06512: at "SEBA.OS_COMMAND", line 68
29532. 00000 -  "Java call terminated by uncaught Java exception: %s"
*Cause:    A Java exception or error was signaled and could not be
           resolved by the Java code.
*Action:   Modify Java code, if this behavior is not intended.

我尝试使用 SYS 帐户授予所需权限。

执行以下代码后:

call dbms_java.grant_permission( 'SEBA', 
                     'SYS:java.io.FilePermission', '/bin/mkdir', 'execute' );

我明白了:

dbms_java.grant_permission 'SEBA', succeeded.

但是,当我尝试执行命令时:

select os_command.exec('/bin/mkdir /home/smucha/testdir_ora3') from dual;
/

我得到了和以前一样的错误。

请告诉我运行os命令需要做什么?

当我以 SYS 连接时,一切正常,因此用户 SEBA 看起来有一些权限问题。

我只是不知道授予哪些权限?

1 个答案:

答案 0 :(得分:0)

我只想分享我的经验,存储过程不会接受通过角色提供的ddl权限。因此,您尝试向用户seba提供的权限是通过角色然后它无效。例如,如果你有角色有权限创建表,如果你把这个角色分配给seba,seba不能通过存储过程创建表。所以我们必须给grant直接创建任何表,或者你必须使用authid当前用户在创建存储过程时。请在这种情况下检查您是否直接授予seba或通过角色。

检查seba是否创建了任何目录权限,如果没有,则提供grant创建任何目录到seba并确保seba从select * from dba_directories获得privilge;