Главная страница
    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.5 MB
Время: 0.006 c
1-55160
VJar
2002-06-04 14:14
2002.06.17
Список процессов


1-55096
Dim!S
2002-06-06 09:51
2002.06.17
Перерисовка DBGrid


1-55071
PVR
2002-06-02 18:34
2002.06.17
Как найти нужную процедуру в BPL


1-55091
Serg2002
2002-06-06 08:47
2002.06.17
И снова о масштабах (пиксел*мм) при печати из Image


7-55324
RM
2002-03-20 21:01
2002.06.17
Как узнать дату BIOS из под Windows XP?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский