tvs_spb |
Отправлено: 13.08.2004, 09:55 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 20
|
Стоит задача в создании приложения,оповещающего пользователя об изменении состояния таблицы в бд.Но хотелось бы это сделать не через опрос по таймеру,а через обработку сообщений генерируемых самой субд.Например,в interbase такой механизм генерации существует,а вот есть ли он в SQLServer и Access,ну и в Oracl(в идиале)?
|
|
AVC |
Отправлено: 13.08.2004, 10:09 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
В Oracl'е я не смог найти даже времени последнего изменения содержимого таблицы (может плохо искал). Есть только дата LastDDL. Если бы была такая информация, то породить событие можно.
Отредактировано AVC — 13/08/2004, 10:12 |
|
Gedeon |
Отправлено: 13.08.2004, 10:18 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
В SQL Server, Oracle есть триггеры, м.б. чего-то есть в Access, дальше в SQL Server есть такая хранимая процедура
SQL | xp_cmdshell {'command_string'} [, no_output] |
с помощью которой можно толкнуть любую программку, дальше дело техники, то же думаю есть и в оракле.
|
|
Guest |
Отправлено: 13.08.2004, 10:52 |
|
Не зарегистрирован
|
QUOTE | ... есть триггеры ... то же думаю есть и в оракле. |
Конечно есть, но так лениво в сотне или более таблиц модифицировать триггеры after уровня таблицы. Кроме того выполнение триггера не гарантирует, что данные действительно изменились — а вдруг был rollback. Хотелось бы триггер типа after commit.
Хотя конечно можно извратиться через еще одну таблицу и там регистрировать даты всех изменений. Но почему этого не делает сам сервер, а если делает то где?
(avc) |
|
Gedeon |
Отправлено: 13.08.2004, 12:30 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (Guest @ 13/08/2004, 11:54) | QUOTE | ... есть триггеры ... то же думаю есть и в оракле. |
Конечно есть. |
Я знаю, что в Oracle есть триггеры.
QUOTE |
то же думаю есть и в оракле
|
относится к xp_cmdshell, про что я не знаю. Еще я не знаю есть ли в оракле что-то подобное TransactionLog, как вариант читать и разбирать его?
|
|
AVC |
Отправлено: 13.08.2004, 13:03 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE | Я знаю, что в Oracle есть триггеры. |
Я и не сомневался . Это было для разгона о триггерах.
Типа TransactionLog не нашел. В литературе не видел и "руками" не смог. У Oracla только разрешенных системных таблиц 240 и информационных views 1280. Настораживает что программа упправления Oracl'ом не показывает эту информацию.
По большому счету данные о последнем изменении таблицы не очень нужны, так как не известно как они влияют на конкретную выборку. |
|
Gedeon |
Отправлено: 13.08.2004, 15:08 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Да тема конечно очень интересная, и, по моему, актуальная. Тут, мне кажется, общего рецепта быть не может, все зависит от каждой задачи конкретно. Если данные меняются только тем, что пишется самим и желательно сейчас, то тут просто, например, у меня сейчас проект: SQL Server, мой сервер, который сам меняет данные, разсылает клиентам команду обновиться, клиент если меняет данные посылает серверу (моему) запрос передать всем команду обновиться, вот собственно и получается всегда актуальный набор данных. А вот если данные м. измениться извне, то тут уже вопрос каждой конкретной БД. В ход могут пойти и триггеры и что еще неизвестно.
|
|
AVC |
Отправлено: 13.08.2004, 15:24 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
А я пошел по другому пути. Так как время выполнения запросов колеблется от долей секунд до нескольких минут и, зачастую, это зависит от параметров, выбираемых пользователем, и кроме того принудительный рефреш может нарушить работу оператора я каждую форму снабдил возможностью делать автообновление через определенное число секунд и дал возможность пользователю управлять этим интервалом (или вообще отказаться от автообновления). Последнее выставленное значение времени сохраняется между сеансами. Так что пользователь сам настраивает то, что ему нужно. |
|
Gedeon |
Отправлено: 13.08.2004, 17:38 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (AVC @ 13/08/2004, 16:26) | Так как время выполнения запросов колеблется от долей секунд до нескольких минут и, зачастую, это зависит от параметров, выбираемых пользователем, и кроме того принудительный рефреш может нарушить работу оператора. |
Вот по этим причинам я как раз от таймеров то и отказался, сервер всегда знает можно ли делать обновление и не делает их зря т.е. не грузим сетку. Плюс рефрэш происходит сразу после обновления данных, а если таймер не успеет сработать перед просмотром пользователя и после изменения в базе, а сильно часто обновлять-то не очень хочется.
|
|
AVC |
Отправлено: 25.08.2004, 10:28 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Все равно вопрос "как влияет изменение данных в конкретной таблице на данную выборку" остался открытым. Я не знаю способа решения за время, значительно меньшее чем refresh.
PS. Извиняюсь за поздний ответ — уезжал. |
|