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

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

TSQLStoredProc и схема [D7]


Andrushk ©   (2005-10-06 11:38:00) 

Есть БД Oracle, в ней процедура AA_TEST.
Использую TSQLStoredProc из dbExpress.
Процедура AA_TEST находится в схеме скажем TEST.
Когда к базе коннектишься под TEST - процедура работает, но стоит законектится под другим пользователем, скажем TEST1 - возникает ошибка.

Пробема не в оракловых правах, TEST1 имеет права на исполнение любой процедуры из TEST. Проблема в SQL который  генерит Delphi.

Перед выполнением процедуры, он выполняет select:
SELECT ....
FROM SYS.ALL_ARGUMENTS A
WHERE (A.DATA_LEVEL = 0) AND (A.DATA_TYPE IS NOT NULL) AND (A.OBJECT_NAME = 'AA_TEST' AND (A.PACKAGE_NAME IS NULL OR A.PACKAGE_NAME = A.OBJECT_NAME)) AND  (A.OWNER = 'TEST1') ORDER BY A.POSITION

Проблема в (A.OWNER = 'TEST1'), Delphi ставит владельцем процедуры схему,под которой законнектился.

Если сделать TSQLStoredProc.SchemaName='TEST', то владелец будет ставиться правильный, но такое решение не нравится (ну например я вообще не хочу к схеме привязываться, есть public-синоним и все).

Хочется заставить DELPHI не включать OWNER в запрос.
Никто такой проблемой не занимался?


Andrushk   (2005-10-06 18:14:00) [1]

Seg   (06.10.05 17:57) [13]

Как вызвать процедуру из TSQLDataSet? Я чего-то сходу не догнал.
Вот есть такая процедура:

CREATE OR REPLACE PROCEDURE AA_Test(v_ret OUT NUMBER) AS
BEGIN
 SELECT 1 INTO v_ret FROM dual;
END;

Попробовал в TSQLDataSet просто ее имя написать с параметром - ошибка, анонимный блок - тоже ошибка...
Ну в данном случае процедуру можно функцией сделать и в селекте вызвать...а если он несколько параметров возвращает...
Короче я не знаю как из TSQLDataSet процедуру выполнить...


Seg   (2005-10-06 17:57:00) [2]

А что здесь кривого?


Andrushk   (2005-10-06 17:48:00) [3]

Seg   (06.10.05 16:46) [11]

Тоже думал об этом...но вроде как-то криво выходит:-)
И переделывать уже сделанное надо...


Seg   (2005-10-06 16:46:00) [4]

Может через TSQLDataSet вызывать процедуру?


Andrushk   (2005-10-06 16:44:00) [5]

evvcom ©   (06.10.05 15:12) [9]

Вечер, не могу никак сообразить что такое "ХП" :-)


evvcom   (2005-10-06 15:12:00) [6]


> Иначе как ты поставишь на один экземпляр 2 копии одной программы?

А как ты в этом случае делаешь с указанием схемы? Или вычислив ее везде подставляешь в StoredProcName?
Я сейчас создал табличку с вариантами схем, на нее повесил ХП с синонимом. После выбора схемы выполняю ALTER SESSION SET current_schema=..., а на клиенте все имена ХП без имен схем.


ANB   (2005-10-06 15:04:00) [7]


> Andrushk   (06.10.05 14:46) [7]

ИМХО. У а нас наоборот от синонимов избавились и везде указывают схему. Иначе как ты поставишь на один экземпляр 2 копии одной программы ?


Andrushk   (2005-10-06 14:46:00) [8]

Seg   (06.10.05 13:22) [6]
А я еще в вопросе написал что тогда OWNER правильно подставляется, ну точнее что в SchemaName напишешь то он в OWNER и прописывает.
Но задача в том, чтобы в программе имя схемы вообще не фигурировало.
Чтобы я выполнил ALTER SESSION SET current_schema=... и все.
Для TSQLDataSet этот номер прокатывает. Все работает.
А для TSQLStoredProc номер не проходит из-за этого дурацкого запроса списка параметров...
Мы кстати проверяли, на разных машинах он поразному генерится, ну т.е. у меня вот добавляется OWNER, а у кого-то не добавляется. Есть предположение что это от установленных обновлений зависит...причем именно когда все обновления стоят этот OWNER и добавляется (но это предположение)...


Seg   (2005-10-06 13:22:00) [9]

у TSQLStoredProc  есть свойство - SchemaName, попробуй туда прописать имя схемы.


Andrushk   (2005-10-06 13:12:00) [10]

2 Seg   (06.10.05 13:03) [4]
А вот как сделать чтобы запрос не генерился? Мне вот как раз и интересно как у TSQLStoredProc можно управлять тем, как он получает информацию о параметрах.
АTStoredProc - это же для BDE.


Seg   (2005-10-06 13:03:00) [11]

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

Есть еще одни вариант: самому перед выполненнием процедуры явно выполнить этот запрос, присвоить параметры, присвоить параметрам значания и запустить процедуру.


Andrushk   (2005-10-06 12:56:00) [12]

2 Reindeer Moss Eater ©
Нет, задача к схеме вообще не привязываться.

2 evvcom ©  
Думаю да dbExpress.
Смысл запроса, как я понимаю, получить информацию о параметрах процедуры, я в вопросе подрезал селект, чтобы покороче было, вот недостающая часть:
SELECT 0, '', A.OWNER, A.OBJECT_NAME, A.ARGUMENT_NAME, 0, A.IN_OUT,
      A.DATA_TYPE, 0, A.DATA_TYPE, A.DATA_LENGTH, A.DATA_PRECISION, A.DATA_SCALE, 1,
   A.TYPE_NAME, A.POSITION

А по поводу псевдонима...всеравно ведь не прокатит, OWNER то ставиться не тот...


evvcom   (2005-10-06 12:09:00) [13]


> Проблема в SQL который  генерит Delphi

Delphi не генерит никакого SQL. Это заблуждение. Кто ж его генерит? dbExpress? А нафига? dbExpress не юзал, но в ОДАКе просто ставлю StoredProcName := 'AA_TEST', в Оракле создаю синоним AA_TEST для объекта TEST.AA_TEST и никаких проблем. И есть еще одно решение...


Reindeer Moss Eater   (2005-10-06 11:47:00) [14]

А укажи полное имя процедуры test.aa_test


Наверх

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