Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос к знатокам динамического SQL


ilandrei ©   (2003-03-18 15:14:00) 

Народ, помогите разобраться!
Есть у меня вот такая процедура

create or replace procedure SQLCursor(curss out TypeDef.c_type, vSQL Varchar2) is
begin
OPEN curss FOR vSQL;
end;

Задача этой процедуры - вернуть ссылку на курсор.
Так вот, если я в качестве параметра передаю запрос, в котором участвуют таблицы моей схемы, то все ОК, если же в запрос входит таблица чужой схемы, то, несмотря на наличие синонима и прав доступа, процедура генерит ошибку ORA-00942 (Table or view doesn"t exist)
Тот же самый запрос в статическом SQL выполняется нормально.
Может быть, кто-то знает, где тут собака порылась?


ilandrei   (2003-03-18 20:24:00) [1]

To Val:
> :) рад за вас, согласитесь, фраза несмотря на наличие синонима и прав доступа об этом не упоминает :)

Нет, не упоминает. Поскольку все необходимые права доступа были изначально переданы через роль - для статического SQL и PL/SQL достаточно, а вот для динамического, как выяснилось, нет!
А про схему безопасности - тут уж каждый для себя волен решать, что ему подходит, что нет - я лишь поспешил поделиться с публикой найденным решением собственной проблемы :)


Val   (2003-03-18 19:56:00) [2]

>ilandrei © (18.03.03 18:53)
сойдет команда grant all privileges...
но, не будет ли это разрушением схемы безопасности?


Val   (2003-03-18 18:57:00) [3]

:) рад за вас, согласитесь, фраза несмотря на наличие синонима и прав доступаоб этом не упоминает :)


ilandrei   (2003-03-18 18:53:00) [4]

Вдогонку - если кому-то еще будет интересна эта тема.
Чтобы не грантовать отдельно каждую таблицу, сойдет команда grant all privileges to <имя пользователя>. Еще один вариант - можно поместить процедуру, открывающую этот проблемный курсор, в схему SYS. Так тоже работает - проверено!


ilandrei   (2003-03-18 18:45:00) [5]

Отвечаю себе сам :)
Для того, чтобы это работало, нужно, чтобы GRANT на SELECT был передан непосредственно, а не через роль. Полдня угробил, пока разобрался...


Val   (2003-03-18 17:07:00) [6]

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


ilandrei   (2003-03-18 15:52:00) [7]

To Val:

Да нет, если бы ругань была из-за переменной, то она бы не зависела от ее содержимого.
Я попробовал так, как Вы предлагаете, и вот теперь-то ругань идет как раз независимо от параметров: invalid SQL statement


Val   (2003-03-18 15:45:00) [8]

хм. может быть ругань идет на vSQL? именно vSQL воспринимается как таблица или view?может использовать следующую конструкцию?
execute immediate "OPEN curss FOR "||vSQL;


ilandrei   (2003-03-18 15:30:00) [9]

Не помогает!


Val   (2003-03-18 15:22:00) [10]

а если напрямую указывать имя_схемы.имя_таблицы?


Наверх

Титульная страница Поиск, карта сайта Написать письмо