Форум: "Базы";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
ВнизTSQLStoredProc и схема Найти похожие ветки
← →
Andrushk (2005-10-06 11:38) [0]Есть БД 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 в запрос.
Никто такой проблемой не занимался?
← →
Reindeer Moss Eater © (2005-10-06 11:47) [1]А укажи полное имя процедуры test.aa_test
← →
evvcom © (2005-10-06 12:09) [2]
> Проблема в SQL который генерит Delphi
Delphi не генерит никакого SQL. Это заблуждение. Кто ж его генерит? dbExpress? А нафига? dbExpress не юзал, но в ОДАКе просто ставлю StoredProcName := "AA_TEST", в Оракле создаю синоним AA_TEST для объекта TEST.AA_TEST и никаких проблем. И есть еще одно решение...
← →
Andrushk (2005-10-06 12:56) [3]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 то ставиться не тот...
← →
Seg (2005-10-06 13:03) [4]Чтобы не генерить этот запрос при каждом обращении процедуры, лучше использовать StoredProc и задать параметры. Тогда все равно, кем ты вошел.
Есть еще одни вариант: самому перед выполненнием процедуры явно выполнить этот запрос, присвоить параметры, присвоить параметрам значания и запустить процедуру.
← →
Andrushk (2005-10-06 13:12) [5]2 Seg (06.10.05 13:03) [4]
А вот как сделать чтобы запрос не генерился? Мне вот как раз и интересно как у TSQLStoredProc можно управлять тем, как он получает информацию о параметрах.
АTStoredProc - это же для BDE.
← →
Seg (2005-10-06 13:22) [6]у TSQLStoredProc есть свойство - SchemaName, попробуй туда прописать имя схемы.
← →
Andrushk (2005-10-06 14:46) [7]Seg (06.10.05 13:22) [6]
А я еще в вопросе написал что тогда OWNER правильно подставляется, ну точнее что в SchemaName напишешь то он в OWNER и прописывает.
Но задача в том, чтобы в программе имя схемы вообще не фигурировало.
Чтобы я выполнил ALTER SESSION SET current_schema=... и все.
Для TSQLDataSet этот номер прокатывает. Все работает.
А для TSQLStoredProc номер не проходит из-за этого дурацкого запроса списка параметров...
Мы кстати проверяли, на разных машинах он поразному генерится, ну т.е. у меня вот добавляется OWNER, а у кого-то не добавляется. Есть предположение что это от установленных обновлений зависит...причем именно когда все обновления стоят этот OWNER и добавляется (но это предположение)...
← →
ANB © (2005-10-06 15:04) [8]
> Andrushk (06.10.05 14:46) [7]
ИМХО. У а нас наоборот от синонимов избавились и везде указывают схему. Иначе как ты поставишь на один экземпляр 2 копии одной программы ?
← →
evvcom © (2005-10-06 15:12) [9]
> Иначе как ты поставишь на один экземпляр 2 копии одной программы?
А как ты в этом случае делаешь с указанием схемы? Или вычислив ее везде подставляешь в StoredProcName?
Я сейчас создал табличку с вариантами схем, на нее повесил ХП с синонимом. После выбора схемы выполняю ALTER SESSION SET current_schema=..., а на клиенте все имена ХП без имен схем.
← →
Andrushk (2005-10-06 16:44) [10]evvcom © (06.10.05 15:12) [9]
Вечер, не могу никак сообразить что такое "ХП" :-)
← →
Seg (2005-10-06 16:46) [11]Может через TSQLDataSet вызывать процедуру?
← →
Andrushk (2005-10-06 17:48) [12]Seg (06.10.05 16:46) [11]
Тоже думал об этом...но вроде как-то криво выходит:-)
И переделывать уже сделанное надо...
← →
Seg (2005-10-06 17:57) [13]А что здесь кривого?
← →
Andrushk (2005-10-06 18:14) [14]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 процедуру выполнить...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.044 c