|
Можно ли передать событие наружу СУБД?
|
|||
---|---|---|---|
#18+
Имеет место быть БД, в которой имеется таблица, в которой _нечасто_ и нерегулярно меняются _некоторые_ значения в полях. Как - совершенно неважно, есть система, которая эти значения обновляет. При попытке изменении значения в оговорённом поле - может срабатывать триггер, который _внутри_ СУБД может выполнить какие-то действия. Вопрос - можно ли каким-либо образом и, в общих чертах - как именно, сделать так, чтобы этот триггер мог подать сигнал об этом событии _наружу_ СУБД? Вызвать какой-то метод из процесса, не являющегося процессом СУБД, послать пакет по какому-то TCP-сокету и т.д. Интересует - отработка другой системы, которая расположена вне СУБД, но которой требуются _актуальность_ тех самых данных, которые нечасто и нерегулярно обновляются в таблице. Перечитывать таблицу по таймеру только для того, чтобы убедиться, что ничего не изменилось - слишком расточительно, вот, если бы такой сигнал можно было подать, то внешняя система сразу бы обратилась к СУБД совершенно стандартным образом - даже не нужно сообщать какой элемент данных изменился. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2003, 19:28 |
|
Можно ли передать событие наружу СУБД?
|
|||
---|---|---|---|
#18+
Может имеет смысл сделать отдельную программу,в которую бы посылались из клиента сообщения об измененных допустим ID,а она бы уже оповещала остальных клиентов.А те в свою очередь обновляли свои ID. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2003, 22:48 |
|
Можно ли передать событие наружу СУБД?
|
|||
---|---|---|---|
#18+
Я вызываю из триггера UDF, которая в свою очередь запускает внешний процесс. Пример: при изменении цены товара менеджером - уходит e-mail шефу о совешенном действии. Или же при возникновении сбоев(в частности - потеря ссылок при подкачке данных извне) ругается через NET SEND(платформа Win) админу. Отдельно есть таблица настроек какую программу запускать и с какими параметрами. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2003, 07:06 |
|
Можно ли передать событие наружу СУБД?
|
|||
---|---|---|---|
#18+
Во-первых - большое спасибо всем. По поводу первого ответа могу сказать - система, складывающая данные в БД - чёрный ящик. Т.е. никаким изменениям не поддаётся по причине того, что пока работает - лучше не трогать :) Второе предложение - гораздо ближе к теме. И ход этой мысли мне очень нравится. Но - не нравится "UDF". Поскольку администрация БД шибко опасается нарушения ейной (БД, не администрации!) целостности и едва-ли позволит клепать что-то "своё". Поэтому, максимум, на что можно рассчитывать - что _администрация_ внесёт в триггер, обслуживающий данное поле, пару-тройку строчек _своими_руками_. Т.к. предел в который администрация эта способна поверить, что "без подвоха" - строки на встроенном языке, то вопрос к моему благодетелю - можно ли на встроенном в DB2 языке (в MS SQL и Sybase - можно) вызвать к жизни процесс с передачей ему строки с параметрами? И - как? У меня определённого рода затруднения с доступом к документации DB2, поэтому я просто сейчас коллекционирую ключевые моменты... Заранее - большое спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2003, 23:49 |
|
Можно ли передать событие наружу СУБД?
|
|||
---|---|---|---|
#18+
Во первых - вся документация выкачивается с родного сайта в формате PDF. Для 7.2 кажется даже все русифицировали. Урлы на работе остались - если надо, могу кинуть, как появлюсь. Или мылом послать "SQL Reference" - две книжки. Во вторых непонятно, чего боится админ БД? Пусть сам скомпилирует и создаст UDF, ниже полные тексты(подразумевается Windows). У меня, правда на Java, но и это должно работать. Атрибут FENCED или NOT FENCED пусть по своему усмотрению ставит. В третьих - если под внутренним языком подразумевается "TRIGGERED SQL" то особо не размахнешься. Других "внутренних" языков, кроме SQL, нет.(Может меня поправят?) Далее тексты собс-но: //===================== begin============== #include <stdlib.h> #include <string.h> #include <stdio.h> #include <sqludf.h> #include <sqlca.h> #include <sqlda.h> /************************************************************************* * function ExecProcC: run process on server * inputs: VARCHAR(500) in * output: INTEGER out **************************************************************************/ #ifdef __cplusplus extern "C" #endif void SQL_API_FN ExecProcC ( SQLUDF_VARCHAR *in, /* input character string */ SQLUDF_SMALLINT *out, /* output 0 - Ok, 1 - Bad */ SQLUDF_NULLIND *innull, /* input NULL indicator */ SQLUDF_NULLIND *outnull, /* output NULL indicator */ SQLUDF_TRAIL_ARGS) { /* trailing arguments */ int st; st = system(in); if (st != 0) { /* errors */ *out = 1; strcpy( ( char * ) sqludf_sqlstate, "38999" ) ; /* error state */ strcpy( ( char * ) sqludf_msgtext, "ExecProcC: ашипка" ) ; /* message insert */ } else { /* sussecs*/ *out = 0; *outnull = 0; } /* endif */ } /* end of UDF : ExecProcC */ /************************************************************* -- DDL: -- ===================================== -- ====== FUNCTION NULLID.EXECPROC ===== -- Lang: "C". File: UDF1.dll -- компилятор: vc60 или Borland C++ Builder 6. -- Запуск программы из UDF -- На входе строка запуска -- на выходе - код запуска процесса 0-нормальный запуск, 1 - ненорамльный. CREATE FUNCTION NULLID.EXECPROC (VARCHAR(254) ) RETURNS INTEGER EXTERNAL NAME 'UDF1!ExecProcC' LANGUAGE C PARAMETER STYLE DB2SQL DETERMINISTIC FENCED RETURNS NULL ON NULL INPUT NO SQL EXTERNAL ACTION NO SCRATCHPAD NO FINAL CALL DISALLOW PARALLEL NO DBINFO; //===================== end============== ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2003, 07:25 |
|
Можно ли передать событие наружу СУБД?
|
|||
---|---|---|---|
#18+
Сильно подозреваю, что это задача для MQSeries ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2003, 13:04 |
|
Можно ли передать событие наружу СУБД?
|
|||
---|---|---|---|
#18+
Дело в том, что посылать сообщения (tcp/ip, e-mail, http...) из триггера - грязное дело. Ведь сообщение может быть отослано, но транзакция за'rollback'чена. Иными словами, кто-то получает письмо, что в таблице что-то изменилось, а там на самом деле ничего не изменилось. Гораздо красивее положить сообщение в очередь под той же транзакцией. Таким образом, чтобы получатель принял сообщение только после COMMIT'а, и не принял бы его после ROLLBACK'а. Мне кажется, что MQSeries именно это и должен обеспечивать. К стыду своему, я с ним пока так и не разобрался. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2003, 13:49 |
|
Можно ли передать событие наружу СУБД?
|
|||
---|---|---|---|
#18+
2 Victor Metelitsa >Дело в том, что посылать сообщения (tcp/ip, e-mail, http...) из триггера - грязное дело. Да я согласен с этим. Но тут несколько моментов. Первый - это желание фиксировать даже попытку а не совершенное действие. Второй - транзакции в этих случаях короткие и почти без откатов. Ну и для админа сообщения чисто информационные - на деньги не влияют. Был rollback, не был - чего-то все равно надо посмотреть. С MQSeries тоже хотелось повозиться, тут как раз время появилось, пока все в отпусках, только где это взять и как прикрутить? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2003, 21:46 |
|
Можно ли передать событие наружу СУБД?
|
|||
---|---|---|---|
#18+
maybe, catch changes to CD-tables and monitor them? Victor Metelitsa what occurs in your model then db2 still works but MQSeries is not available? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2003, 11:21 |
|
Можно ли передать событие наружу СУБД?
|
|||
---|---|---|---|
#18+
А что случится, если Capture не будет доступна? Или DB2 не будет доступна? ;-) Но да, использование CD-таблиц довольно интересно. По крайней мере, использование только закоммиченных данных таким образом может быть гарантировано. Я об этом не подумал, поскольку мы не используем репликацию. Где взять MQSeries (теперь - WebSphere MQ)? Вроде бы оно должно было идти в комплекте с легально купленной DB2. Сайт http://www-3.ibm.com/software/integration/mqfamily/, пробные версии здесь- http://www14.software.ibm.com/webapp/download/product.jsp?s=p&id=TDUN-49EVER&type=b&presb=n&postsb=n&cat=&fam=&rs=&S_TACT=&S_CMP=&q=text+to+search+for&k=any&pf=&dt=TRIAL&v=5.3&x=27&y=9 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2003, 12:46 |
|
Можно ли передать событие наружу СУБД?
|
|||
---|---|---|---|
#18+
Уважаемые господа, Я благодарю всех, кто принял участие в обсуждении и накидал сюда разных хороших идей. Но я должен заметить - помимо собственно конструктивного решения существуют и другие привходящие обстоятельства, влияющие на выбираемое решение инженерное... Собственно, проблема только в "точке оптимального компромисса". Система, с которой нужда заставляет связываться по данным - промышленно эксплуатирующаяся большая, распределённая БД. Написана давно и совсем не теми, кто эксплуатирует. Эксперименты с нею... как бы это сказать - сильно рискованны по своим последствиям. И уж тем более, её никто не будет "усовершенствовать". Ведь это - стоит денег, которые нужно откуда-то взять, кому-то обосновать и т.д. Моя нужда от этой БД - крайне невелика. Мне нужен весьма ограниченный объём данных, отличительная особенность которых - они мало и редко меняются. Но к моей системе предъявляются высокие требования к их актуальности - то, что данные меняются раз в сутки не извиняет меня, что я на сутки от жизни буду отставать. Читать таблицу каждые 5 минут ради того, чтобы быть уверенным в "зазоре" в пять минут? Поэтому мне нужно _уведомление_, что данные не то, что поменялись, а что "с данными, похоже, что-то произошло". Тогда я, совершенно стандартным образом запущу запрос, и их прочитаю. И пусть транзакция откатится, тревога окажется ложной - два, три, даже пять чтений БД в сутки при сохранении "зазора" в 1-2 минуты всё лучше, чем поминутное перечтение? Далее... А вопросы отладки что стоят? Кто даст отлаживаться на промышленном сервере? А уверенность админа, что его не поднимут середь ночи с постели? А гарантированная изоляция от ошибок собственной проги? А - права доступа? Тут - очень много не столько чисто технических, сколько административно-организационных и финансовых проблем. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2003, 22:53 |
|
Можно ли передать событие наружу СУБД?
|
|||
---|---|---|---|
#18+
UDF надо писать самому, репликацию надо налаживать (что может оказаться не совсем просто), а в MQSeries разбираться. Я не постеснялся бы работать и методом опроса, и не раз в пять минут, а раз в минуту. Не вижу причин, почему нет. Нагрузка на сервер будет очень мала. Пришлось бы (для опроса одной таблицы) добавить поле (назовем его UPDSTAMP) типа TIMESTAMP WITH DEFAULT CURRENT TIMESTAMP, индекс по нему (возможно, включающий ключ) с REVERSE SCAN, пару триггеров и вспомогательную таблицу (назовем DELETED) тоже с соответствующим индексом. Один триггер срабатывает BEFORE UPDATE NO CASCADE , его смысл SET UPDSTAMP = CURRENT TIMESTAMP, второй AFTER DELETE - INSERT INTO DELETED VALUES(UPDSTAMP). При каждом цикле спрашиваем, например SELECT 'UPDATES', MAX(UPDSTAMP) FROM таблица UNION ALL SELECT 'DELETED', MAX(UPDSTAMP) FROM DELETED и сравниваем с предыдущими. Если что-то изменилось, перечитываем. (А можно было написать запрос по-другому и сразу брать обновленные записи). Не забывайте делать COMMIT почаще - чтение тоже устанавливает блокировки. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2003, 23:26 |
|
Можно ли передать событие наружу СУБД?
|
|||
---|---|---|---|
#18+
Ошибочка - в триггере после удаления вместо INSERT INTO DELETED VALUES(UPDSTAMP) надо INSERT INTO DELETED VALUES(CURRENT TIMESTAMP) (или INSERT INTO DELETED VALUES(CURRENT TIMESTAMP, ключ удаленной записи)). Т.е. нас волнует, когда запись была удалена, а не когда она последний раз изменялясь. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2003, 12:12 |
|
Можно ли передать событие наружу СУБД?
|
|||
---|---|---|---|
#18+
И организация обнаружения обновлений могла быть получше, без добавления колонок (я вижу сейчас целых три варианта). ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2003, 10:40 |
|
Можно ли передать событие наружу СУБД?
|
|||
---|---|---|---|
#18+
для MS SQL 2000 я написал ESP на С++, посредством тригеров посылает информацию об изменениях таблицы непосредственно зарегистрированным пользователям. Использую UDP сокеты для этого дела. С периодом ESP уведомляет клиентов что жива. Если клиент не получает обновление, то читает обновления сам по таймеру. Вот планирут написaть тоже самое для DB2 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2005, 23:41 |
|
Можно ли передать событие наружу СУБД?
|
|||
---|---|---|---|
#18+
Я опять предложу Q-Replication/Event Publisher это и мониторинг измененных данных и отправка их по MQ Series (теперь правильное название WebSphere MQ) с промежуточным преобразованием. WebSphere Q Replication SQL Replication Road Map SQL Replication Road Map ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2005, 13:20 |
|
|
start [/forum/topic.php?fid=43&msg=32232087&tid=1605912]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 300ms |
total: | 446ms |
0 / 0 |