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

С уважением, link_master
...
Рейтинг: 0 / 0
Как отследить изменения и зафиксировать их?
    #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
Как отследить изменения и зафиксировать их?
    #33759990
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли в постгрисах сделать так чтобы данные об изменениях первой таблицы фиксировались во второй посредством триггеров? Если можно то хотелось бы услышать какие либо предложения по реализации сей фигни


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

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

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

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

Спасибо ;)

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


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