Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.server -> 8.1.7 -> 9.2.0.3 & DB-LINK
Добрый день, уважаемые!
Поможите, плз., решить одну маленькую проблему при переходе с 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