Как программе узнать об изменениях в таблице базы данных?
Миллион строк в таблице, одна строка изменилась, ещё одна - добавилась. Как программе это побыстрее заметить и показать пользователю?
Логично, что триггеры срабатывают на вышеуказанные события.
Начинаю писать:
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
...
А дальше что писать? Как уведомить мою программу?
PS: база на Oracle, программа на Delphi+ODAC.
WHERE Id = id AND column1 = oldValue1 AND column2 = oldValue2
Если ни одна строка не обновилась, значит были изменения и надо принимать меры.
WHERE Id = id AND column1 = oldValue1 AND column2 = oldValue2
Если ни одна строка не обновилась, значит были изменения и надо принимать меры.
Ну мне только прочитать надо, да и апдейтить миллион РАЗНЫХ строк так не выйдет или будет идти пару минут, что неприемлемо.
Мне этот подход тоже не особо по душе, однако на счет скорости можно поспорить ... если строк не миллион, а узнать о изменениях все-таки надо, то вполне приемлемо сравнить пару строк и несколько чисел.
В одном проекте думал над этой проблемой и пришел к такому же варианту как у oxotnik333'а... Но в результате забил и оставил оптимистический подход :)
Триггер пишет в дополнительное поле число. При любом добавлении/изменении данных это число в строке данных увеличивается. Программа по таймеру выбирает только те записи, у которых этот номерок больше максимального номерка из предыдущей выборки.
-- триггер для пометки записей
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
Хотя, может быть, мой метод проще и надёжней.
Увы, изменения в мой Оракл приходят не только с сервера приложений (Веблоджик), но и из других 4 (!) баз (другие сервера и даже не Оракл) через джобы напрямую.
PS: база на Oracle, программа на Delphi+ODAC.
Это оно и есть.
Проще говоря - вы сообщаете серверу какие обекты хотите наблюдать и всё. По их изменению, сервер вам сообщит.
После регистрации открывается отдельный порт и в отдельном потоке происходит взаимодействие клиента и сервера, для того, что бы приложение могло обработать эти сообщения (Notification - сообщения) и делается функция обратного вызова - дело в то, 8 строчек всего.. :)