Oracle: использование ссылки на базу данных в хранимой процедуре: таблица или представление не существует

В настоящее время у меня есть проблема, из-за которой я не могу ссылаться на таблицу в связанной базе данных в рамках хранимой процедуры. Я получаю сообщение об ошибке:

ORA-00942: таблица или представление не существует

Вот шаги, которые я предпринял на хост-компьютере (с оракулом 10g), чтобы настроить связь базы данных с удаленной базой данных (с оракулом 11g). Шаги точны, но некоторые имена были изменены, хотя они остались прежними.

  1. Обновите tnsnames.ora, добавив новую запись:

    REMOTE_DB =
        (DESCRIPTION =
            (ADDRESS = (PROTOCOL = TCP)
                       (HOST = 10.10.10.10)
                       (QUEUESIZE = 20)
                       (PORT = 1521)
            )
            (CONNECT_DATA =
                       (SERVICE_NAME = remote_service)
            )
        )
    
  2. Создайте ссылку на базу данных от имени пользователя, который позже будет создавать и выполнять хранимую процедуру:

    create database link remote_link
    connect to "remote_user"
    identified by "remote_pass"
    using 'REMOTE_DB';
    
  3. Докажите, что ссылка на базу данных работает, выбрав из нее:

    select id from remote_table@remote_link;
    
    id
    --------------------------------------------------------------------------------
    8ac6eb9b-fcc1-4574-8604-c9fd4412b917
    c9e7ee51-2314-4002-a684-7817b181267b
    cc395a81-56dd-4d68-9bba-fa926dad4fc7
    d6b450e0-3f36-411a-ba14-2acc18b9c008
    
  4. Создайте хранимую процедуру, которая зависит от работающей ссылки на базу данных:

    create or replace
    PROCEDURE test_remote_db_link
    AS
    v_id varchar(50);
    BEGIN   
        select id into v_id from remote_table@remote_link where id = 'c9e7ee51-2314-4002-a684-7817b181267b';
        dbms_output.put_line('v_id : ' || v_id);
    END test_remote_db_link;
    
  5. Взорвать себе голову, глядя на следующее сообщение об ошибке в течение всего рабочего дня:

    Error(10,27): PL/SQL: ORA-00942: table or view does not exist
    

Я пробовал много вещей, чтобы попытаться решить эту проблему, в том числе:

  1. При создании ссылки на базу данных не используйте кавычки вокруг имени пользователя и пароля. Ссылка создается нормально, но выбор из нее дает мне эту ошибку:

    ERROR at line 1:
    ORA-01017: invalid username/password; logon denied
    ORA-02063: preceding line from TWS_LINK
    
  2. Пробовал разные комбинации логина и пароля в верхнем/нижнем регистре. Получил ту же ошибку, что и 1.

  3. Пробовал одинарные кавычки вместо двойных кавычек вокруг имени пользователя и пароля. Получил эту ошибку:

    ERROR at line 1:
    ORA-00987: missing or invalid username(s)
    
  4. Доказано, что у меня есть полный доступ к удаленной базе данных, подключившись к ней с помощью sqlplus:

    [oracle]$ sqlplus remote_user/remote_pass@REMOTE_DB
    
    SQL*Plus: Release 10.2.0.1.0 - Production on Thu Oct 20 22:23:12 2011
    
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    
    SQL> 
    

Я не уверен, что делать дальше. Возможный следующий шаг — начать поиск проблем в удаленной базе данных и, возможно, посмотреть, могут ли другие базы данных подключиться к ней. Другой вариант — посмотреть на несовместимости при переходе от хоста 10g к удаленному 11g.


person Clarkey    schedule 20.10.2011    source источник
comment
Тот же симптом может возникнуть, если ваша привилегия выбора исходит от роли. У вас должны быть прямые разрешения на объект, чтобы использовать его в программе pl/sql. см. dba-oracle.com/concepts/roles_security.htm   -  person Tim Peters    schedule 09.10.2012


Ответы (3)


Итак, я смог заставить это работать, своего рода.

Оказывается, при создании ссылки на базу данных проблема заключалась в двойных кавычках вокруг полей имени пользователя и пароля. Обобщить:

Если бы они присутствовали, а ссылка создавалась так:

create database link remote_link
connect to "remote_user"
identified by "remote_pass"
using 'REMOTE_DB';
  1. Удаленная база данных может быть запрошена через sql
  2. Хранимая процедура не удалось скомпилировать, получена ошибка ORA-942.
  3. Поскольку процедура не может быть скомпилирована, она не может быть выполнена

Когда двойные кавычки отсутствуют:

create database link remote_link
connect to remote_user
identified by remote_pass
using 'REMOTE_DB';
  1. Удаленная база данных не может быть запрошена через sql, получая ошибку неверного пароля (подробности в вопросе)
  2. Хранимая процедура может скомпилироваться без ошибок.
  3. Хранимая процедура выполняется, как и ожидалось, извлекает данные из ссылки на базу данных и отображает их.

Таким образом, несмотря на то, что удаленная база данных не может быть запрошена через sql, получая ошибку неверного пароля, процедура, использующая ту же информацию о соединении, компилируется и выполняется нормально.

Я уверен, что вы согласитесь, это любопытное положение вещей, и я действительно наткнулся на то, как заставить его работать в моем сценарии. Я не совсем уверен, что назвал бы это решением, так как есть много вопросов без ответов.

Надеюсь, если кто-то придет сюда через Google, он найдет этот ответ полезным и, по крайней мере, запустит свой код.

GC.

person Clarkey    schedule 24.10.2011
comment
Все еще не могу отпустить это ... Похоже, пароль на 11g чувствителен к регистру и выигрывает от того, что он заключен в кавычки. Найдено из этой записи в блоге: pbarut.blogspot.com/ 2008/08/db-link-to-oracle-11g.html - person Clarkey; 14.11.2011

Я столкнулся с той же проблемой на 11gR2, и я благодарен этому форуму за помощь в поиске проблемы. Чтобы заставить ссылку db работать как в SQL, так и в процедуре, нужно следовать приведенному ниже синтаксису (заключите только пароль в двойные кавычки).

create database link remote_link
connect to remote_user
identified by "remote_pass"
using 'REMOTE_DB';
person Sanjog    schedule 02.04.2012

Думаю, я вижу здесь проблему. Является ли пользователь, выполняющий хранимую процедуру, тем же пользователем, который создал хранимую процедуру?

Вы сказали: «Создайте ссылку на базу данных от имени пользователя, который позже будет выполнять хранимую процедуру».

Если пользователь, создающий ссылку на базу данных, отличается от пользователя, создающего хранимую процедуру, это может быть вашей проблемой.

Попробуйте создать хранимую процедуру и ссылку на базу данных от имени одного и того же пользователя или создать ссылку на общедоступную базу данных.

Затем, поскольку Oracle по умолчанию имеет права определения, вы можете поручить выполнение хранимой процедуры любому (при условии, что ему предоставлены права на выполнение процедуры).

person Mark J. Bobak    schedule 20.10.2011
comment
Привет, спасибо за ответ. Я сделал все с одним и тем же пользователем, т.е. создал ссылку на базу данных и попытался создать процедуру с тем же пользователем. Ссылка на общедоступную базу данных — хорошая идея. Я попробую это дальше. - person Clarkey; 20.10.2011
comment
Вы получаете ошибку ORA-942 во время компиляции или во время выполнения? (Я предполагаю время компиляции?) - person Mark J. Bobak; 21.10.2011
comment
Да, я получаю ORA-942 во время компиляции. Я пытался использовать общедоступную ссылку на базу данных, но получаю те же ошибки. Никакой разницы с обычной ссылкой на базу данных: s - person Clarkey; 21.10.2011