powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / История действий пользователей
12 сообщений из 12, страница 1 из 1
История действий пользователей
    #35064415
Rust()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо решить такую задачу: есть таблица над которой пользователи совершают 3 вида возможных операций (вставка, обновление, удаление записи). Необходимо обеспесить ведение истории действий пользователей (кто, что и когда сделал) для возможности контроля и отката действий пользователя. Есть ли красивое и простое решение такой задачи?
...
Рейтинг: 0 / 0
История действий пользователей
    #35064533
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Триггеры.
...
Рейтинг: 0 / 0
История действий пользователей
    #35064631
Rust()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я понимаю что без триггеров не обойдешься. Как организовать структуру?
...
Рейтинг: 0 / 0
История действий пользователей
    #35064780
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rust()я понимаю что без триггеров не обойдешься. Как организовать структуру?
Код: 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.
28.
29.
30.
31.
create table hist_t as 
(
select USER as who_, CURRENT TIMESTAMP as when_, cast('U' as char( 1 )) as operation_, t.*
from t
) definition only;

create trigger t_ais
after insert on t
referencing new table as n
for each statement
insert into hist_t
select USER, CURRENT TIMESTAMP, 'I', n.*
from n;

create trigger t_ads
after delete on t
referencing old table as o
for each statement
insert into hist_t
select USER, CURRENT TIMESTAMP, 'D', o.*
from o;

create trigger t_aus
after update on t
referencing old table as o new table as n
for each statement
insert into hist_t
select USER, CURRENT TIMESTAMP, 'O', o.*
from o
  union all
select USER, CURRENT TIMESTAMP, 'N', n.*
from n;
...
Рейтинг: 0 / 0
История действий пользователей
    #35064819
чя321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В 9.5 можно аудит настроить и он будет фиксировать все запросы и параметры которые выполнял пользователь.
...
Рейтинг: 0 / 0
История действий пользователей
    #35065171
Rust()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответы, приму к сведению. Но есть еще проблемка: в таблицу истории необходимо еще фиксировать ip адрес машины пользователя, который вытаскивается в приложении. То есть такая ситуация: приложение знает ip адрес и пытается вызвать sql запрос (действие пользователя). В итоге, в таблице истории должна быть информация что сделал пользователь и с какой машины.
...
Рейтинг: 0 / 0
История действий пользователей
    #35065226
Vladimir Kiselev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rust()Спасибо за ответы, приму к сведению. Но есть еще проблемка: в таблицу истории необходимо еще фиксировать ip адрес машины пользователя, который вытаскивается в приложении. То есть такая ситуация: приложение знает ip адрес и пытается вызвать sql запрос (действие пользователя). В итоге, в таблице истории должна быть информация что сделал пользователь и с какой машины.
Почему не использовать, например, хранимую? Свои тараканы , понятно, но зато можно писать в журнал всё, что надо. В этом случае триггеры не нужны.
...
Рейтинг: 0 / 0
История действий пользователей
    #35065466
Rust()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
то есть в таком случае без триггеров решается? Не красиво. А возможно ли в пределах одной транзакции сначала записать ip адрес в таблицу истории, а затем триггерным способом дописать в историю изменения?
...
Рейтинг: 0 / 0
История действий пользователей
    #35065972
Vladimir Kiselev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rust()то есть в таком случае без триггеров решается? Не красиво. А возможно ли в пределах одной транзакции сначала записать ip адрес в таблицу истории, а затем триггерным способом дописать в историю изменения?
Как и мой вариант (я же говорил, свои тараканы в этом способе), Ваш также некрасив, увы, поскольку имеет разнесенные операции по формированию журнала.
Теоретически (не пробовал) можно в основной таблице завести "лишнее" поле, которое будет содержать ip пользователя, который эту запись модифицировал, вставил, удалил последним ;) Избыточность, но функционал соответствует Вашему описанию задачи. В этом случае триггер сработает и запишет всё как надо, в том числе текущее значение ip пользователя.
...
Рейтинг: 0 / 0
История действий пользователей
    #35066239
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rust()Спасибо за ответы, приму к сведению. Но есть еще проблемка: в таблицу истории необходимо еще фиксировать ip адрес машины пользователя, который вытаскивается в приложении. То есть такая ситуация: приложение знает ip адрес и пытается вызвать sql запрос (действие пользователя). В итоге, в таблице истории должна быть информация что сделал пользователь и с какой машины.См. application_id() .
Если у вас не трехзвенка, то используйте в триггере напрямую.
Она возвращает вот что.
Если ваше приложение лучше знает ip адрес (трехзвенка), то можно так:
1. Создайте таблицу ip(appl_id varchar(128) not null primary key, ip ...)
2. После connect: insert into ip values (application_id(), <ip>)
3. В триггере используйте ее:
insert into hist_t
select USER, CURRENT TIMESTAMP, 'I'
, (select ip from ip where appl_id=application_id()) as ip
, n.*
from n
4. В конце работы delete from ip where appl_id=application_id()
...
Рейтинг: 0 / 0
История действий пользователей
    #35067945
Rust()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот это то что нужно, спасибо за помощь!!!
...
Рейтинг: 0 / 0
История действий пользователей
    #35068138
Rust()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
выяснилась особенность: функция application_id() возвращает идентификатор приложения текущего соединения с базой. А если все пользователи соединяются с базой под одним пользователем и соединение берется из пула. то этот идентификатор может быть одинаковым для различных пользвателей. Нет ли фунции получения идентификатора сесси текущего соединения?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / История действий пользователей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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