【问题标题】:PLSQL Access Different SchemaPLSQL 访问不同的模式
【发布时间】:2015-07-01 09:56:19
【问题描述】:

我有一个需要访问多个数据库的 PL/SQL 例程;我的开发环境是带有 Toad 的 Oracle XE 和 Eclipse。我已授予用户(在本例中为 SAMPLES)对另一个模式(在本例中为 CORE.SAMPLE)的选择权限,以便查询,例如:

SELECT count(*) from core.sample;

当以用户身份运行时,SAMPLES 工作得很好。但是,我在一个包中有一个程序,如下所示:

CREATE OR REPLACE PACKAGE BODY CORE_SEARCH
AS
    FUNCTION search_barcode (barcode IN VARCHAR2)
        RETURN BOOLEAN
    IS
        num_lines   INT;
    BEGIN
        SELECT COUNT (*)
        INTO num_lines
        FROM CORE.SAMPLE s
        WHERE s.barcode = barcode;

        RETURN num_lines > 0;
    END;
END;
/

我正在使用 TOAD,而 toad 抱怨说 CORE.SAMPLE 不可用,当我尝试在 Oracle DB(在 SAMPLES 模式中)中编译它时,它不起作用。我得到了臭名昭著的“PL/SQL:ORA-00942:表或视图不存在”,但是我知道 SAMPLES 用户可以访问 core.sample,因为原始 SQL 语句有效,所以为什么存储过程不能。这就是我调用存储过程进行测试的方式:

begin
    CORE_SEARCH.SEARCH_BARCODE('test');
end;

再次以对 CORE.SAMPLE 表具有选择权限的 SAMPLES 用户身份运行。

有人可以帮忙解释为什么会这样吗?谢谢。

尼尔

【问题讨论】:

  • 您是如何将您的 core.sample 表上的选择授予示例用户的?是直接授予,还是授予角色,然后授予示例用户?
  • 有趣的是,我最初授予了一个对简单 sql 语句不起作用的角色,所以我直接授予它并且简单的 sql 语句起作用了。
  • 您可以尝试创建同义词并检查它是否适合您。

标签: oracle stored-procedures plsql


【解决方案1】:

假设您从 SAMPLES 调用该过程,您需要在调用它时添加包的所有者(假设是 CORE):

CORE.CORE_SEARCH.SEARCH_BARCODE('test');

【讨论】:

  • 它归样本所有
【解决方案2】:

通过删除先前授予的角色解决了该问题,该角色赋予了对表的选择权限,并且用户也对表具有选择权限。只是用户工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2019-05-29
    • 1970-01-01
    • 2012-05-11
    • 2012-06-03
    • 2015-11-22
    • 1970-01-01
    相关资源
    最近更新 更多