【问题标题】:Using synonyms with Oracle package在 Oracle 包中使用同义词
【发布时间】:2017-10-15 21:05:15
【问题描述】:

我为一个包创建了一个同义词,但我不能用它做任何事情,包括一个简单的 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 64bits; SQL 开发者 4.0.3.16; ORACLE 客户端 11.2

同义词详情:

包裹详情:

【问题讨论】:

  • 我假设您向同义词所有者提供了授权执行,对吧?
  • 我把赠款给了包裹,因为我似乎不能只为这个程序做。
  • 将架构添加到命令CREATE SYNONYM [SCHEMA].pkg_elmah$log_error FOR DRSP.pkg_elmah$log_error;
  • 试过了,错误是一样的。
  • 您确定您确实执行了授权,并且之后没有 - 比如说 - 删除并重新创建包吗?您仍然会从您的电话中获得 PLS-00306,但 PLS-00201 应该会随着授权的到位而消失。 (您可以尝试在授权后以非所有者身份重新连接,但这不是必需的)。

标签: oracle package synonym


【解决方案1】:

您做某事的顺序有误,或者没有告诉我们一些事情。因为按正确顺序执行的指令按预期工作:

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> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2011-10-06
    • 2011-05-01
    • 2010-09-21
    相关资源
    最近更新 更多