Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Отслеживание изменений данных / 7 сообщений из 7, страница 1 из 1
03.10.2001, 08:46
    #32014891
Отслеживание изменений данных
Здравствуйте, уважаемые!
Возникла тут задача написания небольшой кадровой системы. В связи с этим захотелось иметь механизм отслеживания изменений данных. К примеру есть сущность Персона с аттрибутом Фамилия. До 1.01.2001 была фамлия Петров, а потом стала Иванов. Соответсвенно в документах, которые ссылаются на Персону, датированных до 1.01.2001 должна появляться Петров, а после Иванов. Этот механизм по идее должен распространятся и на другие атрибуты и другие сущности. Т.е. измениться может и адрес и паспорт и занимемая должность. Но что-то я не могу подобрать нормальную структуру для реализации подобного механизма. В голову приходит что-то уж совсем абстрактное, типа:


table OBJECTS(ObjId int, ObjClass id, ParentObjId int)
table ATTRIBUTES( ObjId int, ATTRIBId int, FROM_Date datetime, TO_DATE datetime,
Val_type int, Val_Int int, Val_char varchar, Val_Date datetime, Val_Money money)


Это конечно сильно утрировано, но смысл должен быть понятен. Я никогда с подобными схемами не работал - по-моему это не вполне реляционный подход и с его реализацией могут возникнуть проблемы. По-этому хочется спросить у уважаемых мной посетителей форума - если кто реализовывал подобные схемы, какие тут есть подводные камни (в частности возможность построения эффективных запросов с условиями по нескольким атрибутам), стоит ли вообще за это браться, или другие предложения по реализации механизма отслеживания изменений данных.
...
Рейтинг: 0 / 0
03.10.2001, 16:22
    #32014923
Владимир
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание изменений данных
Такие вещи очень просто отследить с помощью таблиц в которых храниться история изменений. Как это сделать - просто прикинуть что и как нужно хранить и вперед, можно создать триггер, который при изменении определенных колонок отправляет инормацию в таблицу-историю с предидущими данными, а те что изменились остаются в основной таблице. И так далее, изменилось опять опять занесли...Велосипед изобретать не надо, все уже придумано...
...
Рейтинг: 0 / 0
03.10.2001, 19:16
    #32014926
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание изменений данных
В SQL2000 есть тип данных sql_variant, который позволяет сохранять и читать данные любых(почти) типов соответственно.
Поэтому таблица ATTRIBUTES может выглядеть так
ObjId int, ATTRIBId int, FROM_Date datetime, TO_DATE datetime,
Val_type int, Val_value sql_variant
есть одно ограничение - если фактическая длина заносимых в запись данных превысит 8060 байт произойдет ошибка. Но при предложенной структуре у вас остается 8060 - 4 - 4 - 8 - 8 - 4 = 8032 байта
...
Рейтинг: 0 / 0
04.10.2001, 06:24
    #32014942
Lesnick
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание изменений данных
Меня тоже интересует этот вопрос.
Идея хранения в доп таблице с помощью триггеров мне приходила, но вот еще вопрос-
ведь все изменения записываются в лог файл. Можно ли его как нибудь читать(хотябы как текст)?
Я нигде не смог найти об этом информации.
...
Рейтинг: 0 / 0
04.10.2001, 06:34
    #32014945
Daymon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание изменений данных
Владимир правильно сказал
у меня это реализованно так
table Person (idrow(pk),idperson(fk),fam,name,secname,....,begindate,enddate)
где begindate,enddate -период когла данные были правильные
для актуальной информации enddate >> текущей даты (у меня 31/12/2099)
для 2000 реализованн udf который возвращает эту дату
изображаешь тригера и медод получения данных для старых данных,
Да в этом случае индефикатор человека не может быть PK, надо создавать некую таблицу
в которой будут храниться эти уникальные значения (как правило получается таблица с одним полем которая служит самым верхнрм pk)
...
Рейтинг: 0 / 0
04.10.2001, 07:02
    #32014949
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание изменений данных
2Daymon
А если несколько пользователей одновременно(или поочередно) в течении короткого промежутка(скажем 10-15 мин) времени правят(каждый по своему) значение одного и того же аттрибута, то как вы в том случае определяете потом актуальное значение этого аттрибута - ведь за этот же промежуток времени могло быть создано несколько документов, ссылающихся на сущность Персона (если пользоваться примером Михаила Куркова) ?
...
Рейтинг: 0 / 0
08.10.2001, 05:40
    #32015001
tygra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание изменений данных
To Glory, Daymon
Владимир собственно совсем о другом говорил:
Таблица с персонами - это одна таблица, там лежат только актуальные данные и все, чего мудрить то.
Таблица с историей изменений - это другая таблица, там лежат старые данные и дата, до которой они были действительны, типа: EndDate, Name, FName, MName ... и т.д. Ни каких нескольких документов ни на кого не ссылается. Хоть сотня человек изменит данные за 5 минут в таблицу изменений будут ложиться те данные, которые были на момент изменения в таблице.
Стандартный же прием, об этом Владимир и говорил, чего выдумывать.
А со структурой Daymon возможна конечно некоторая путаница.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Отслеживание изменений данных / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]