Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как программе узнать об изменениях в таблице базы данных?

30K
26 декабря 2009 года
yegorkin
11 / / 24.10.2007
Как программе узнать об изменениях в таблице базы данных?

Миллион строк в таблице, одна строка изменилась, ещё одна - добавилась. Как программе это побыстрее заметить и показать пользователю?
11
26 декабря 2009 года
oxotnik333
2.9K / / 03.08.2007
организовать триггер(ы) на эту таблицу
30K
27 декабря 2009 года
yegorkin
11 / / 24.10.2007
Цитата: oxotnik333
организовать триггер(ы) на эту таблицу



Логично, что триггеры срабатывают на вышеуказанные события.

Начинаю писать:

CREATE OR REPLACE TRIGGER MYTRIGGER
AFTER UPDATE OR INSERT ON MYTABLE REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW WHEN (NEW.MYTYPE='URGENT')
DECLARE
...

А дальше что писать? Как уведомить мою программу?

11
27 декабря 2009 года
oxotnik333
2.9K / / 03.08.2007
можно генерить каждый раз в триггере некий UIN и куда либо его складывать, а в программе-клиенте в отдельном потоке сделать постоянный опрос этого значения, и если текущее не равно предыдущему, то произошли изменения.
30K
27 декабря 2009 года
yegorkin
11 / / 24.10.2007
А что это за привилегия такая - "CHANGE NOTIFICATION"?

PS: база на Oracle, программа на Delphi+ODAC.
1.9K
27 декабря 2009 года
GreenRiver
451 / / 20.07.2008
Либо "путь" VisualStudio когда в запросе на изменения присутствуют старые параметры, типа:

 
Код:
UPDATE table SET column1 = newValue1, column2 = newValue2
   WHERE Id = id AND column1 = oldValue1 AND column2 = oldValue2

Если ни одна строка не обновилась, значит были изменения и надо принимать меры.
30K
27 декабря 2009 года
yegorkin
11 / / 24.10.2007
Цитата: GreenRiver
Либо "путь" VisualStudio когда в запросе на изменения присутствуют старые параметры, типа:

 
Код:
UPDATE table SET column1 = newValue1, column2 = newValue2
   WHERE Id = id AND column1 = oldValue1 AND column2 = oldValue2

Если ни одна строка не обновилась, значит были изменения и надо принимать меры.



Ну мне только прочитать надо, да и апдейтить миллион РАЗНЫХ строк так не выйдет или будет идти пару минут, что неприемлемо.

6
27 декабря 2009 года
George
4.1K / / 05.01.2007
в файрберде например для этого ивенты есть. подозреваю, что в оракле тоже такое может быть. надо плистерона спросить.
1.9K
27 декабря 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: yegorkin
Ну мне только прочитать надо, да и апдейтить миллион РАЗНЫХ строк так не выйдет или будет идти пару минут, что неприемлемо.


Мне этот подход тоже не особо по душе, однако на счет скорости можно поспорить ... если строк не миллион, а узнать о изменениях все-таки надо, то вполне приемлемо сравнить пару строк и несколько чисел.
В одном проекте думал над этой проблемой и пришел к такому же варианту как у oxotnik333'а... Но в результате забил и оставил оптимистический подход :)

30K
27 декабря 2009 года
yegorkin
11 / / 24.10.2007
Придумал метод без колбека:

Триггер пишет в дополнительное поле число. При любом добавлении/изменении данных это число в строке данных увеличивается. Программа по таймеру выбирает только те записи, у которых этот номерок больше максимального номерка из предыдущей выборки.

-- триггер для пометки записей
CREATE OR REPLACE TRIGGER MYTABLE_MARK
BEFORE INSERT OR UPDATE ON MYTABLE
FOR EACH ROW
DECLARE NEXTVAL INTEGER;
BEGIN
SELECT MARKSEQ.NEXTVAL INTO NEXTVAL FROM DUAL;
:NEW.MARK := NEXTVAL;
END;
/

-- получить свежие записи с момента предыдущей выборки
select a.*
from mytable a
where a.mark>:max_previous_mark
order by a.mark desc
;

Но коллбек был бы эффективней, убеждает презентация http://www.oraclebi.ru/files/presentations/imelnikov/ChangeNotification.pdf
Хотя, может быть, мой метод проще и надёжней.
11
27 декабря 2009 года
oxotnik333
2.9K / / 03.08.2007
еще вариант - сделать 3-х звенку, в которой сервер приложений будет знать о всех изменениях, пришедших с клиентов и уведомлять всех заинтересованных об этих изменениях.
30K
27 декабря 2009 года
yegorkin
11 / / 24.10.2007
Цитата: oxotnik333
еще вариант - сделать 3-х звенку, в которой сервер приложений будет знать о всех изменениях, пришедших с клиентов и уведомлять всех заинтересованных об этих изменениях.



Увы, изменения в мой Оракл приходят не только с сервера приложений (Веблоджик), но и из других 4 (!) баз (другие сервера и даже не Оракл) через джобы напрямую.

30K
01 июля 2010 года
noi
5 / / 19.06.2007
Цитата: yegorkin
А что это за привилегия такая - "CHANGE NOTIFICATION"?

PS: база на Oracle, программа на Delphi+ODAC.


Это оно и есть.
Проще говоря - вы сообщаете серверу какие обекты хотите наблюдать и всё. По их изменению, сервер вам сообщит.
После регистрации открывается отдельный порт и в отдельном потоке происходит взаимодействие клиента и сервера, для того, что бы приложение могло обработать эти сообщения (Notification - сообщения) и делается функция обратного вызова - дело в то, 8 строчек всего.. :)

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог