Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / История действий пользователей / 12 сообщений из 12, страница 1 из 1
16.01.2008, 09:55
    #35064415
Rust()
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
История действий пользователей
Необходимо решить такую задачу: есть таблица над которой пользователи совершают 3 вида возможных операций (вставка, обновление, удаление записи). Необходимо обеспесить ведение истории действий пользователей (кто, что и когда сделал) для возможности контроля и отката действий пользователя. Есть ли красивое и простое решение такой задачи?
...
Рейтинг: 0 / 0
16.01.2008, 10:26
    #35064533
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
История действий пользователей
Триггеры.
...
Рейтинг: 0 / 0
16.01.2008, 10:47
    #35064631
Rust()
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
История действий пользователей
я понимаю что без триггеров не обойдешься. Как организовать структуру?
...
Рейтинг: 0 / 0
16.01.2008, 11:24
    #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
16.01.2008, 11:34
    #35064819
чя321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
История действий пользователей
В 9.5 можно аудит настроить и он будет фиксировать все запросы и параметры которые выполнял пользователь.
...
Рейтинг: 0 / 0
16.01.2008, 13:02
    #35065171
Rust()
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
История действий пользователей
Спасибо за ответы, приму к сведению. Но есть еще проблемка: в таблицу истории необходимо еще фиксировать ip адрес машины пользователя, который вытаскивается в приложении. То есть такая ситуация: приложение знает ip адрес и пытается вызвать sql запрос (действие пользователя). В итоге, в таблице истории должна быть информация что сделал пользователь и с какой машины.
...
Рейтинг: 0 / 0
16.01.2008, 13:13
    #35065226
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
История действий пользователей
Rust()Спасибо за ответы, приму к сведению. Но есть еще проблемка: в таблицу истории необходимо еще фиксировать ip адрес машины пользователя, который вытаскивается в приложении. То есть такая ситуация: приложение знает ip адрес и пытается вызвать sql запрос (действие пользователя). В итоге, в таблице истории должна быть информация что сделал пользователь и с какой машины.
Почему не использовать, например, хранимую? Свои тараканы , понятно, но зато можно писать в журнал всё, что надо. В этом случае триггеры не нужны.
...
Рейтинг: 0 / 0
16.01.2008, 14:06
    #35065466
Rust()
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
История действий пользователей
то есть в таком случае без триггеров решается? Не красиво. А возможно ли в пределах одной транзакции сначала записать ip адрес в таблицу истории, а затем триггерным способом дописать в историю изменения?
...
Рейтинг: 0 / 0
16.01.2008, 16:21
    #35065972
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
История действий пользователей
Rust()то есть в таком случае без триггеров решается? Не красиво. А возможно ли в пределах одной транзакции сначала записать ip адрес в таблицу истории, а затем триггерным способом дописать в историю изменения?
Как и мой вариант (я же говорил, свои тараканы в этом способе), Ваш также некрасив, увы, поскольку имеет разнесенные операции по формированию журнала.
Теоретически (не пробовал) можно в основной таблице завести "лишнее" поле, которое будет содержать ip пользователя, который эту запись модифицировал, вставил, удалил последним ;) Избыточность, но функционал соответствует Вашему описанию задачи. В этом случае триггер сработает и запишет всё как надо, в том числе текущее значение ip пользователя.
...
Рейтинг: 0 / 0
16.01.2008, 17:23
    #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
17.01.2008, 12:24
    #35067945
Rust()
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
История действий пользователей
вот это то что нужно, спасибо за помощь!!!
...
Рейтинг: 0 / 0
17.01.2008, 13:05
    #35068138
Rust()
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
История действий пользователей
выяснилась особенность: функция application_id() возвращает идентификатор приложения текущего соединения с базой. А если все пользователи соединяются с базой под одним пользователем и соединение берется из пула. то этот идентификатор может быть одинаковым для различных пользвателей. Нет ли фунции получения идентификатора сесси текущего соединения?
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / История действий пользователей / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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