Oracle: использование ссылки на базу данных в хранимой процедуре: таблица или представление не существует - PullRequest
11 голосов
/ 20 октября 2011

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

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

Вот шаги, которые я предпринял на хост-компьютере (под управлением Oracle 10g), чтобыустановить ссылку на базу данных с удаленной базой данных (работает oracle 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.

Ответы [ 3 ]

6 голосов
/ 24 октября 2011

ОК, так что я смог получить эту работу, своего рода.

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

Если они присутствовали, а ссылка создана следующим образом:

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, получая ошибку неверного пароля, процедура, использующая эту информацию о соединении, компилируется и выполняется нормально.

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

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

GC.

4 голосов
/ 02 апреля 2012

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

create database link remote_link
connect to remote_user
identified by "remote_pass"
using 'REMOTE_DB';
2 голосов
/ 20 октября 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...