C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
генерация системных сообщений бд, задача контроля изменения бд
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 есть триггеры. biggrin.gif
QUOTE

то же думаю есть и в оракле

относится к xp_cmdshell, про что я не знаю. Еще я не знаю есть ли в оракле что-то подобное TransactionLog, как вариант читать и разбирать его?
AVC
Отправлено: 13.08.2004, 13:03


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
Я знаю, что в Oracle есть триггеры.  biggrin.gif

Я и не сомневался biggrin.gif . Это было для разгона о триггерах.
Типа 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)
Так как время выполнения запросов колеблется от долей секунд до нескольких минут и, зачастую, это зависит от параметров, выбираемых пользователем, и кроме того принудительный рефреш может нарушить работу оператора.

Вот по этим причинам я как раз от таймеров то и отказался, сервер всегда знает можно ли делать обновление и не делает их зря т.е. не грузим сетку. cool.gif Плюс рефрэш происходит сразу после обновления данных, а если таймер не успеет сработать перед просмотром пользователя и после изменения в базе, а сильно часто обновлять-то не очень хочется.
AVC
Отправлено: 25.08.2004, 10:28


Ветеран

Группа: Модератор
Сообщений: 1583



Все равно вопрос "как влияет изменение данных в конкретной таблице на данную выборку" остался открытым. Я не знаю способа решения за время, значительно меньшее чем refresh.
PS. Извиняюсь за поздний ответ — уезжал.

Вернуться в Работа с базами данных в C++Builder