我创建了一个包的同义词,但是我无法用它做任何事情,包括一个简单的desc命令。查看代码:
创建包sql(在所有者用户上执行)
create or replace PACKAGE pkg_elmah$log_error
IS
PROCEDURE LogError
(
v_ErrorId IN elmah$error.errorid%TYPE,
v_Application IN elmah$error.application%TYPE,
v_Host IN elmah$error.host%TYPE,
v_Type IN elmah$error.type%TYPE,
v_Source IN elmah$error.source%TYPE,
v_Message IN elmah$error.message%TYPE,
v_User IN elmah$error.username%TYPE,
v_AllXml IN elmah$error.allxml%TYPE,
v_StatusCode IN elmah$error.statuscode%TYPE,
v_TimeUtc IN elmah$error.timeutc%TYPE
);
END pkg_elmah$log_error;
创建同义词和测试sql(在非所有者用户上执行)
CREATE SYNONYM pkg_elmah$log_error FOR DRSP.pkg_elmah$log_error;
desc pkg_elmah$log_error;
---------RESULT: object does not exist
execute pkg_elmah$log_error.logerror;
---------RESULT: identifier pkg_elmah$log_error must be declared
当我与这些对象的所有者登录时,这些代码运行正常。
Grant给出如下(我似乎无法仅给出程序,因为它给出了ORA-04042,所以我把它交给了包裹):
grant execute on PKG_ELMAH$LOG_ERROR to not_owner
环境:WINDOWS 7 64位; SQL DEVELOPER 4.0.3.16; ORACLE CLIENT 11.2
答案 0 :(得分:2)
您正在以错误的顺序做某事或以其他方式省略告诉我们的事情。因为以正确顺序执行的指令按预期工作:
SQL> conn a/a
Connected.
USER is "A"
SQL> create or replace PACKAGE pkg_elmah$log_error
2 IS
3 PROCEDURE LogError
4 (
5 v_ErrorId IN number,
6 v_Application IN varchar2,
7 v_Host IN varchar2,
8 v_Type IN varchar2,
9 v_Source IN varchar2,
10 v_Message IN varchar2,
11 v_User IN varchar2,
12 v_AllXml IN varchar2,
13 v_StatusCode IN varchar2,
14 v_TimeUtc IN date
15 );
16
17 END pkg_elmah$log_error;
18 /
Package created.
SQL> grant execute on PKG_ELMAH$LOG_ERROR to b
2 /
Grant succeeded.
SQL> conn b/b
Connected.
USER is "B"
SQL> CREATE SYNONYM pkg_elmah$log_error FOR A.pkg_elmah$log_error;
Synonym created.
SQL> desc pkg_elmah$log_error
PROCEDURE LOGERROR
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
V_ERRORID NUMBER IN
V_APPLICATION VARCHAR2 IN
V_HOST VARCHAR2 IN
V_TYPE VARCHAR2 IN
V_SOURCE VARCHAR2 IN
V_MESSAGE VARCHAR2 IN
V_USER VARCHAR2 IN
V_ALLXML VARCHAR2 IN
V_STATUSCODE VARCHAR2 IN
V_TIMEUTC DATE IN
SQL> exec pkg_elmah$log_error.logerror
BEGIN pkg_elmah$log_error.logerror; END;
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'LOGERROR'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
SQL>