Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.17;
Скачать: CL | DM;

Вниз

SQL in UDF   Найти похожие ветки 

 
Ш-К   (2002-05-22 09:04) [0]

Можно ли засунуть запрос in UDF.
Т.е. например, триггер одной таблицы вызывает UDF, а UDF, в свою очередь, в другой таблице инвертирует данные.
И что, для этого в dll нужно засовывать IBX компоненты?


 
Digitman ©   (2002-05-22 09:17) [1]

нет, такой возможности в IB6 не существует
и ничего никуда "засовывать" не нужно ...
вообще не очень понятно, зачем такие сложности ...может, пояснишь ?


 
Ш-К   (2002-05-22 09:47) [2]

Имеется база. Один клиент получает показания с приборов и шлёт в БД. Приборы разные, класифицируются по типам. Для каждого типа таблица. Каждая запись прибор. На каждую такую таблицу повешены триггеры, пост_евентсы и "обслуживающие" процедуры и таблицы. Да, ещё всё натянуто на пост_евентсы; для оперативного мниторинга на других клиентах. Эти таблицы отражают текущее состояние системы. Все события журнализируются. Всё работает нормально.

С недавнего времени возникла необходимость у пользователей своеручно создавать в БД новые типы устройств, а равно, и таблицы, и триггеры, и хранимые процедуры. Причём всё это должно делаться через пользовательский интерфейс кликами мышки.

Вот и пытаюсь примерить: можно ли расширить существующую систему до новой, как можно меньше перестраивая её?

И как это делать? Спасибо.


 
Digitman ©   (2002-05-22 10:10) [3]

Стоп ! Какое отношение ко всему этому имеют UDF в данном случае ? Какая нестанд.функц-ть была реализована в существующих UDF до сего момента ?


 
kaif ©   (2002-05-22 10:22) [4]

Согласен с Digitman © (22.05.02 10:10).
Лучше не "как можно меньне перестраивать систему", а как можно меньше перестраивать ее принципы. Мне кажется, стоит просто расширить ее новыми таблицами и процедурами, сохраняя имеющийся стиль. А сделать это можно и кликами мыши. Ведь IB позволяет использовать CREATE TABLE, CREATE PROCEDURE, CREATE TRIGGER и т. п.
Тем более стоит так поступить, если система хорошо работает.
Если нужно при этом изменить тексты каких то процедур, то это тоже можно сделать с помощью ALTER PROCEDURE. Кстати, эта команда очень хорошо работает (можно даже не отключать юзеров в момент ее применения).


 
Ш-К   (2002-05-22 11:10) [5]

2 Digitman © (22.05.02 10:10) kaif © (22.05.02 10:22)

Нестандарной функциональности UDF до сего момента не было. Её и хочу ввести. Потомучто система вынужденна расширится, имхо, ещё на одно внешнее приложение. Будет это отдельный клиент или сервер приложений не столь важно.

И если его всеравно выполнять в отдельном коннекте, то почемубы не засунуть его логику в UDF (UDF"s)? Например, данные от БД он получает через UDF, а отправляет все запросы чарез TQuery.
Почему так нельзя?

Сделать БД аморфной и к тому же работаспособной через одни креаты и алерты... я просто увязну навечно. Поэтому и нужно что-то внешнее.

А ломать базу не хочу.


 
Johnny Smith ©   (2002-05-22 11:38) [6]

А организовать в UDF-шке самостоятельный коннект к базе разве нельзя?
Понимаю, что это не настолько элегантно как в Оракле (я писал в свое время внешнюю процедурку, которая делала Select"ы к базе) - там связь с базой для выполнения SQL-запросов осуществляется через т.н. контекст (то есть не открывается дополнительный коннект).


 
Ш-К   (2002-05-22 12:00) [7]


> А организовать в UDF-шке самостоятельный коннект к базе
> разве нельзя?
> Понимаю, что это не настолько элегантно как в Оракле (я
> писал в свое время внешнюю процедурку, которая делала Select"ы
> к базе) - там связь с базой для выполнения SQL-запросов
> осуществляется через т.н. контекст (то есть не открывается
> дополнительный коннект).


Вот это и пытаюсь выяснить.
Где об этом можно глянуть по подробнее?


 
Johnny Smith ©   (2002-05-22 12:21) [8]

2Ш-К (22.05.02 12:00)
Где об этом можно глянуть по подробнее?
Ну, если только на www.ibase.ru


 
Digitman ©   (2002-05-22 12:46) [9]

>Ш-К

Затея твоя, конечно, непростая и прелюбопытная. Только все равно непонятно, зачем ? Зачем, спрашивается, обращаться к объектам IB-базы из какой-то там UDF, если это с успехом и без всяких "фокусов" делается в SP/триггерах ? Ведь задачи, возлагаемые на UDF в общем и целом совершенно иные - реализовать нечто нестандартное, невозможное встроенными средствами механизма триггеров и хранимых процедур ! Ну, к примеру, быстро и эффективно вычислить конт.сумму чего-то там ... или, скажем, получить hash-код некоей строки ... ведь упаришься эти алгоритмы реализовывать довольно скудными возможностями интерактивного SQL, за рамки которого в SP/View/триггерах не выпрыгнешь ! А в UDF это "сотворить" - пожалуйста ! Элементарно ! Неограниченный простор для фантазии ! Быстро, наглядно и эффективно !

Ну, уж коль тебя таки "приспичило" использовать в UDF объекты IB по всем правилам, то - в чем проблема ? В чем принципиальная разница в реализации UDF и обычного приложения, реализующего доступ к IB тем или иным способом ? Да ни в чем ! Те же компоненты (если ты ими пользуешься), та же схема коннекта к базе, тот же механизм вставки/удаления/модификации записей, что предоставляет TDataSet... Единственная тонкость в том, что тело такой (как, впрочем, и любой другой) UDF не должна завершаться с исключением, ибо вызывающая UDF-функцию процедура/триггер/фильтр не сможет определить класс возникшего в UDF исключения и принять адекватные ему меры ... не говоря уже об утечках ресурсов IB-процесса, вызвавшего UDF, которая завершилась (по исключению или нормально), не позаботившись о корректном освобождении занятых ей ресурсов.



 
kaif ©   (2002-05-22 14:58) [10]

Я вижу целый ряд проблем:
1.UDF должна быть thread safe, так как одновременно работает много пользователей.
2.Неясно, при Connect из такой DLL, как password формировать.
3.Неясно, что будет происходить с транзакцией, из под которой стартовала новая транзакция, теперь уже изнутри UDF. Что, например, означает откат старшей транзакции в таких условиях?
4.Уже справедливо замечено о исключительных ситуациях, которые тоже представят собой значительный гимор, особенно в плане освобождения ресурсов в thread safe.

В общем, я боюсь, проще заново всю базу переписать.


 
Digitman ©   (2002-05-22 16:06) [11]

Мда... заморочек в такой схеме, конечно, немало ... тем не менее реализовать все же можно ... но - опять же - через ж....)

Можно, к примеру, воспользоваться возможностями AppServer"а в 3-хзвенной архитектуре. Кому как не AppServer"ру знать параметры тек.коннекта и хэндлы объектов, открытых gds-клиентом в тек.сессии тек.клиента ? А связать (заставить взаимодействовать) тем или иным образом экз-р AppServer"а и UDF (для однозначной идентификации связки) вполне реально. Т.е. UDF, получив управление, передает некие параметры (определяющие, что и как нужно модифицировать в IB-бази и от имени какого клиента/сессии) диспетчеру AppServer"а, который уже, собственно, и исполняет требуемое в нужной транзакции нужного клиента, которые известны и подконтрольны ему от и до.
Да, это и дико и смешно, но - тем не менее - не исключает возможности практ.реализации ... хоть и через ж...


 
Fay ©   (2002-05-22 19:44) [12]

Я понял.
Человек хочет не функцию, а процедуру.
Низя.


 
Ш-К   (2002-05-23 00:06) [13]

2 Fay © (22.05.02 19:44)


> Человек хочет не функцию, а процедуру.


И не просто процедуру.

2 Digitman

> Зачем, спрашивается, обращаться к объектам IB-базы из какой-то
> там UDF, если это с успехом и без всяких "фокусов" делается
> в SP/триггерах ?


Абсолютно согласен. Только в моём конкректном случае БД с изменяемой структурой, пользоваться одними возможностями IB накладно по причине маштабности приложения. Не спорю: всё, что мне надо, можно решить в рамках SP/View/триггерах. Проблема в том, что я не безграничен во времени.

Вот и приходится искать обходные маневры. Такие, как расширение возможностей UDF"s.

Понятно, что использование IB компонентов в UDF приведёт к неизбежным проблемам. Тогда уж лучше и не загонять их в библиотеку.

Как такой вариант?
Строится трёхзвенка. Даже и не она совсем. AppServer лежит не прослойкой, а где-нибудь позади базы. И служит расширением возможностей БД под мою конкректную задачу. (Реализовать возможности через AppServer мне легче раз в 10, чем делать то же средствами IB).
Когда пользователь создаёт новую таблицу, в неё автоматически добавляются триггеры. В триггерах находятся те самые UDF, о которых я говорю с самого начала. Для каждой таблицы они одни и теже (допустим их 6, по типам триггеров).
Так вот, UDF ничего не делает, только передаёт данные на AppServer через WM_CopyData (DDE, Sockets...) На AppServer"е данные успешно принимаются и обрабатываются в отдельных потоках.
Очень похоже на post_event/EventAlerter, с той лишь разницей, что сразу поступают данные, а не зарегистрированные посты.

Если рассматривать каждую таблицу как тип приборов, а запись как сам прибор, такой подход снимает много проблем. Я могу добавлять прибор, удалять, следить за изменениями. Похоже на ООБД.

Наверника, кто-то делал нечто подобное.
Будут ли тут проблемы?
Может существуют другие, готовые решения/компоненты?

kaif © (22.05.02 14:58)

> В общем, я боюсь, проще заново всю базу переписать.


А как ты это представляешь? Можешь по конкретнее?
Спасибо.



Страницы: 1 вся ветка

Текущий архив: 2002.06.17;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.014 c
14-55320
BAHO
2002-05-08 01:51
2002.06.17
Знатоки FoxPro ПОМОГИТЕ !!!


1-55172
Yuri Btr
2002-06-04 12:48
2002.06.17
Поменять главную форму...


1-55102
Alexis2k
2002-06-06 10:26
2002.06.17
Как встроить VCL компонент в PopUpMenu?


1-55179
Vladimir B.
2002-06-04 09:44
2002.06.17
Как правильно удалять объект?


4-55353
_TOLTEC
2002-04-15 02:12
2002.06.17
Хендл окна