Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.server -> 8.1.7 -> 9.2.0.3 & DB-LINK

8.1.7 -> 9.2.0.3 & DB-LINK

From: Serj <Serj_at_mail.primorye.ru>
Date: Mon, 23 Jun 2003 15:56:09 +1100
Message-ID: <bd61s2$bob$1@news.primorye.ru>


Добрый день, уважаемые!

Поможите, плз., решить одну маленькую проблему при переходе с 8.1.7 на 9.2.0.3.0.
1) Есть пользователь (технологическая схема) t1, у него есть приватный авторизованный (заданы имя и пароль подключения) дб-линк (d1) и пакет (p1) с функцией (f3), возвращающей курсор основанный на этом дб-линке. 2) Есть конечный пользователь t2, которому t1 грантовал права на запуск пакета.
Все это описывает пример, приведенный ниже. Так вот, на 8.1.7 - все работало, а на 9.2.0.3 - при попытке t2 профетчить курсор, получанный через t1.p1.f3 возникает ошибка "ORA-02019: описание соединения для
удаленной БД не найдено". :(


connect sys_at_SID as sysdba

drop user t1 cascade;
create user t1 identified by t1;
grant connect,resource to t1;

drop user t2 cascade;
create user t2 identified by t2;
grant connect,resource to t2;

connect t1/t1_at_SID

create database link d1
connect to t1 identified by t1
using 'SID';

create package p1 as
type r1 is record (dummy varchar2(100)); type c1 is ref cursor return r1;

function f1 return varchar2;
function f2 return c1;
function f3 return c1;
end;
/

create package body p1 as

function f1 return varchar2
as
r varchar2(100);
begin
select * into r from dual_at_d1;
return r;
end;

function f2 return c1
as
r c1;
begin
open r for
select * from dual;
return r;
end;

function f3 return c1
as
r c1;
begin
open r for
select * from dual_at_d1;
return r;
end;
end;
/

grant all on p1 to t2 with grant option;

connect t2/t2_at_SID
set serveroutput on;

--create database link d1
-- connect to t1 identified by t1
-- using 'SID';

begin
dbms_output.put_line('Single value');
dbms_output.put_line('Result1 |=>'||t1.p1.f1); end;
/

declare
c1 t1.p1.c1;
r1 t1.p1.r1;
begin
dbms_output.put_line('Local cursor');
c1:=t1.p1.f2;
fetch c1 into r1;
dbms_output.put_line('Result1 |=>'||r1.dummy); end;
/

declare
c1 t1.p1.c1;
r1 t1.p1.r1;
begin
dbms_output.put_line('Remote cursor');
c1:=t1.p1.f3;
fetch c1 into r1;
dbms_output.put_line('Result1 |=>'||r1.dummy); end;
/


Проблема, как я понимаю именно в курсоре, так как функция f1, основанная на том же запросе, но возвращающая конкретное значение - работает! Причем, если раскоментарить строки создания и у конечного пользователя t2 нужного дб-линка, то все работает. Так же помогает создание авторизованного паблик дб-линка. Но ведь все это большая дырка в безопасности (а в первом случае и большой геморой). И главное, совершенно нелогично.

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

С уважением,
Serj Received on Sun Jun 22 2003 - 23:56:09 CDT

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US