Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > изменение данных


Автор: UnixBeginner 13.2.2006, 13:13
есть таблица с данными:
Код

CREATE TABLE t_echograms_layers
(
  id int4, 
  "limit" float4, 
  CONSTRAINT t_echograms_layers_id_fkey FOREIGN KEY (id)
      REFERENCES t_echograms (id) MATCH SIMPLE
)

первичного ключа нет.
Выбираю эти данные по полю id и вывожу в таблице.
Теперь необходимо проследить: изменялись ли данные, были ли удалены какие-либо строки.
Как это можно реализовать если не обращаться к БД сразу после одного из этих действий (удаление, изменение, вставка)?
Просто предположительный алгоритм, без привязки к языку.

Правда есть предположение: ввести еще одно поле в программе - показатель - были данные изменени, ... и потом его проверять.
Что посоветуете?

Автор: Akina 13.2.2006, 13:27
Триггеры, регистрирующие изменение в БД в специальной таблице.
Журнал называется.
Добавлено @ 13:27
Цитата(UnixBeginner @ 13.2.2006, 14:13 Найти цитируемый пост)
Правда есть предположение: ввести еще одно поле в программе - показатель - были данные изменени, ... и потом его проверять.

тогда уж timestamp последнего изменения записи - но что делать с удаленными?

Автор: UnixBeginner 13.2.2006, 13:34
Цитата(Akina @ 13.2.2006, 13:27 Найти цитируемый пост)
Триггеры

просто изменения происходят в программе, а не в БД.
Т.е. программа выбрала данные и все, затем пользователь работает уже с локальной копией, редактирует, ...
А вносить изменения в БД необходимо только после того, как он нажал на кнопку "Save".

Вроде триггеры тут не помогут.

Автор: Akina 13.2.2006, 13:39
Цитата(UnixBeginner @ 13.2.2006, 14:34 Найти цитируемый пост)
Вроде триггеры тут не помогут.

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

Задача же триггера - просто зафиксировать факт изменения данных: какие данные, как, когда и кем изменены. Что делать с этой информацией - это уже совсем другой вопрос.

Автор: Bose 13.2.2006, 13:41
триггеры помогут отследить разницу между тем, что было в базе до того, как пользователь нажал Save, и что там оказалось после того...

если тебя интересует, именно процесс изменений данных на компьютере пользователя, то... это наверное ручками придётся обрабатывать... или триггерами в локальной базе данных smile

Автор: UnixBeginner 13.2.2006, 20:21
ладно, видать нужно почитать по больше по БД, ьриггеры и другие примочки. Я пока в этом не особо разбирался, просто создавал таблицы и связи, а вот с тавими вопросами не сталкивался smile

Автор: Akina 14.2.2006, 10:23
Есть другой подход.
База данных дополняется полями TimeStamp As DateTime и Valid As Boolean.
Поля НЕ РЕДАКТИРУЮТСЯ и НЕ УДАЛЯЮТСЯ. Любое действие по изменению - это установка Valid в False и создание новой записи с обновленным контентом. Удаление - просто установка Valid в False. Получается и журнал (лог атомов транзакций), и база в одном файле.

Очень хорошо подходит для БД с низким (менее 5 в сутки) процентом обновления.

Автор: batigoal 14.2.2006, 12:50
По идее, если не нужно вести полную историю изменений, можно ограничиться только последними n версиями. Тогда хотя бы таблицу не так разнесет.

Автор: SergeBS 14.2.2006, 12:52
UnixBeginner
Почитай Глеба Уфимцева:
Сервис многократной отмены 'SQL-UNDO 2' в многопользовательской системе, построенной на движке MSSQL-server 7.0
http://www.gvu.newmail.ru/sql_undo_2.htm

Мне очень понравилось. В принципе перешивается и для других движков.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)