Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как отследить изменения и зафиксировать их? / 9 сообщений из 9, страница 1 из 1
30.05.2006, 10:45
    #33759807
link_master
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить изменения и зафиксировать их?
Доброе время суток!
К примеру есть таблица T1 с полями keyfield, field1, field2, filed3. и еще одна таблица T2 в которой отслеживаются изменения первой таблицы. Поля Т2 - Номер изменения, дата и время изменения, битовая карта изменения - допустим у нас 4 поля за которыми надо следить соответственно карта - значение 0000 до 1111 или что-то подобное, поле с хранящимися старыми значениями изменяемых полей, и поле с новыми значения изменяемых полей Т1.
Можно ли в постгрисах сделать так чтобы данные об изменениях первой таблицы фиксировались во второй посредством триггеров? Если можно то хотелось бы услышать какие либо предложения по реализации сей фигни НУ И ЕСТЕСТВЕННО советы и прочие другие мысли

С уважением, link_master
...
Рейтинг: 0 / 0
30.05.2006, 11:20
    #33759941
victor_kr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить изменения и зафиксировать их?
С помощью триггеров все можно сделать, получается быстро и просто. Причем, если нужно делать для большого количества таблиц, то можно написать процедуру, которая сгенерирует код для триггерных процедур и самих триггеров.
В своей реализации я сгенерировал функции и триггеры, которые заполняют таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
CREATE TABLE inserts
(
  id int4 NOT NULL DEFAULT nextval('inserts_id_seq'::regclass),
  command_dt timestamp,
  command_src varchar( 1000 ), -- Код команды, которую нужно выполнить для получения сделанных изменений
  table_id int4 NOT NULL, -- ссылка на tables.id
  "user" varchar( 50 ) NOT NULL, -- логин пользователя базы данных
  tuple_id int4 NOT NULL -- идентификатор добавленной записи
)
CREATE TABLE updates
(
  id int4 NOT NULL DEFAULT nextval('updates_id_seq'::regclass),
  command_dt timestamp NOT NULL,
  command_src varchar( 1000 ) NOT NULL,
  column_id int4 NOT NULL, -- ссылка на колонку, значение которой изменилось columns.id
  result_value varchar( 4000 ), -- Значение колонки после выполнения команды
  "user" varchar( 50 ) NOT NULL, -- логин пользователя базы данных
  tuple_id int4 NOT NULL -- идентификатор измененной записи
)
CREATE TABLE deletes
(
  id int4 NOT NULL DEFAULT nextval('deletes_id_seq'::regclass),
  command_dt timestamp NOT NULL,
  command_src varchar( 1000 ) NOT NULL,
  table_id int4 NOT NULL, -- ссылка на tables.id
  "user" varchar( 50 ) NOT NULL, -- логин пользователя базы данных
  tuple_id int4 NOT NULL -- идентификатор удаленной записи
)


+ таблицы описания структуры, которые автоматически заполняются.
Получилась довольно универсальная штука, которую не нужно переделывать при переносе в БД с другой структурой.
...
Рейтинг: 0 / 0
30.05.2006, 11:31
    #33759990
wbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить изменения и зафиксировать их?
Можно ли в постгрисах сделать так чтобы данные об изменениях первой таблицы фиксировались во второй посредством триггеров? Если можно то хотелось бы услышать какие либо предложения по реализации сей фигни


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

битовая карта изменения -- помойму некоректно, насколько я помню посгря(и не только посгря) не обещает что послеовательность полей сохраняется со временем.(вобщем то она конечно не меняется но забиватся на это я бы не стал)

и смысл от битовой карты неясен если у тебя в одной строке только изменение одной строчки то и в битовой карте будет выставленно только одна единица,надежнее уже тогда просто запоминать имя поля.
...
Рейтинг: 0 / 0
30.05.2006, 11:33
    #33760003
wbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить изменения и зафиксировать их?
...только изменение одной строчки то и в...

читать как
...только изменение одного поля то и в...
...
Рейтинг: 0 / 0
30.05.2006, 11:42
    #33760051
link_master
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить изменения и зафиксировать их?
А если допустим в таблице будут с помощью одного запроса изменены несколько полей? Строка то одна, но пока никто не отменял UPDATE c несколкими полями для изменения... Как быть тогда? И ты заранее не знаешь сколько полей будет изменено одно, первое и третье или все...
Вот для этого я считаю и нужна битовая карта..., но не на уровне номера поля а с условным соглашением что если светится бит 1000 то меняешь поле, то которое ты считаешь первым, (не постгри а программер)... или что-то подобное...
...
Рейтинг: 0 / 0
30.05.2006, 11:53
    #33760108
victor_kr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить изменения и зафиксировать их?
Если изменяется несколько полей, то делается несколько записей в таблице updates. Чтобы проверить что изменилось именно это поле, а не какое-нибудь другое нужно старое значение поля сравнить с новым значением поля. В триггере для конкретной таблицы известны все имена полей этой таблицы. Можно создать таблицу описания полей в котором каждому полю присвоить числовой идентификатор (что я и сделал для упрощения работы, этого можно и не делать, можно вместо идентификаторов использовать имена). Т.е. все действия можно выполнить на plpgsql. На мой взгляд никаких битовых масок и других языков для решения этой задачи использовать не нужно.
...
Рейтинг: 0 / 0
30.05.2006, 12:13
    #33760213
link_master
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить изменения и зафиксировать их?
вполне разумно... вычленять атомарные изменения (изменения одного поля) и в совокупности получить несколько записей об изменениях, самое главное при таком подходе чтобы время изменений полученных в результате одного запроса было одинаковым для всех записей, которые попадут в таблицу Updates после выполнения триггера.
В этом случае такой подход может являться решением...
Но вот если поле попадает в UPDATE запрос то не является ли это признаком того что оно уже призвано измениться?
Допустим этот запрос генерируется оболочкой на стороне клиента, может пусть она и смотрит какое поле изменилось а какое нет и по результатам строит запрос?

Спасибо ;)

будем пробовать
...
Рейтинг: 0 / 0
30.05.2006, 12:24
    #33760272
victor_kr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить изменения и зафиксировать их?
Возможно, анализировать изменения полей со стороны оболочки проще, но есть ряд существенных недостатков:
1. Кто-то может воспользоваться другой оболочкой и внесенные изменения не будут отражены в истории.
2. При дальнейшем развитии базы данных может возникнуть ситуация когда триггер другой таблицы изменяет значение в таблице, изменения в которой вы хотите отследить. Оболочка об этом ничего не узнает и не сможет сохранить изменения в истории.
...
Рейтинг: 0 / 0
30.05.2006, 12:40
    #33760350
link_master
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить изменения и зафиксировать их?
Тоже верно... оболочку напрягать такими вещами тоже будет несовсем корректно...
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как отследить изменения и зафиксировать их? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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