Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.11.27;
Скачать: CL | DM;

Вниз

Аудит триггером составной транзакции   Найти похожие ветки 

 
Гость   (2010-02-03 10:40) [0]

Доброго дня!
Есть программа, которая выполняет в одной транзакции delete, insert, update. Есть триггер:

create or replace trigger SAMPLE_AUD
 before insert or delete or update on SAMPLE_TABLE
 for each row


, задача которого отловить все изменения и записать в таблицу аудита. Проблема в том, что отлавливается только insert. Можно ли сделать так, чтобы триггер отрабатывал на каждую команду в транзакции?


 
Sergey13 ©   (2010-02-03 10:49) [1]

А все действия на одной таблице производятся?


 
Гость   (2010-02-03 10:50) [2]

да


 
12 ©   (2010-02-03 10:51) [3]

должно работать..
А что за версия?

на моей, покоцанной/бесплатной работает и инсерт и апдейт

> create or replace trigger SAMPLE_AUD
>  before insert or delete or update on SAMPLE_TABLE
>  for each row

BEGIN
INSERT INTO audit VALUES (:old.name, :new.name)
END


 
Sergey13 ©   (2010-02-03 10:51) [4]

> [2] Гость   (03.02.10 10:50)

А можно сам тригер увидеть?


 
Гость   (2010-02-03 10:56) [5]

create or replace trigger INASTRBUD_AUD
 before insert or delete or update on INASTRBUD
 for each row
declare
 New_Idaud xx_audit.INASTRBUD_AUD.IDAUD%TYPE;
begin
 SELECT SEQ_INASTRBUD_AUD.NEXTVAL INTO New_Idaud FROM Dual;
 IF Updating THEN
   IF :old.IDNTYPBUDG <> :new.IDNTYPBUDG OR :old.IDNBACC <> :new.IDNBACC OR
      :old.IDNBUDGET <> :new.IDNBUDGET OR
      :old.IDINASTRBUD <> :new.IDINASTRBUD THEN
     INSERT INTO xx_audit.INASTRBUD_AUD
       (IDNTYPBUDG,
        IDNBACC,
        IDNBUDGET,
        IDINASTRBUD,
        IDAUD,
        DML_TYPE,
        DML_TYPEU,
        TERMINAL,
        OS_USER,
        IP_ADRES,
        SESSION_USER)
     VALUES
       (:old.IDNTYPBUDG,
        :old.IDNBACC,
        :old.IDNBUDGET,
        :old.IDINASTRBUD,
        New_Idaud,
        "U",
        "0",
        TRIM(Sys_Context("userenv", "TERMINAL")),
        TRIM(Sys_Context("userenv", "OS_USER")),
        TRIM(Sys_Context("userenv", "IP_ADDRESS")),
        TRIM(Sys_Context("userenv", "SESSION_USER")));
     INSERT INTO xx_audit.INASTRBUD_AUD
       (IDNTYPBUDG,
        IDNBACC,
        IDNBUDGET,
        IDINASTRBUD,
        IDAUD,
        DML_TYPE,
        DML_TYPEU,
        TERMINAL,
        OS_USER,
        IP_ADRES,
        SESSION_USER)
     VALUES
       (:new.IDNTYPBUDG,
        :new.IDNBACC,
        :new.IDNBUDGET,
        :new.IDINASTRBUD,
        New_Idaud,
        "U",
        "1",
        TRIM(Sys_Context("userenv", "TERMINAL")),
        TRIM(Sys_Context("userenv", "OS_USER")),
        TRIM(Sys_Context("userenv", "IP_ADDRESS")),
        TRIM(Sys_Context("userenv", "SESSION_USER")));
   END IF;
 ELSIF Inserting THEN
   INSERT INTO xx_audit.INASTRBUD_AUD
     (IDNTYPBUDG,
      IDNBACC,
      IDNBUDGET,
      IDINASTRBUD,
      IDAUD,
      DML_TYPE,
      DML_TYPEU,
      TERMINAL,
      OS_USER,
      IP_ADRES,
      SESSION_USER)
   VALUES
     (:new.IDNTYPBUDG,
      :new.IDNBACC,
      :new.IDNBUDGET,
      :new.IDINASTRBUD,
      New_Idaud,
      "I",
      "",
      TRIM(Sys_Context("userenv", "TERMINAL")),
      TRIM(Sys_Context("userenv", "OS_USER")),
      TRIM(Sys_Context("userenv", "IP_ADDRESS")),
      TRIM(Sys_Context("userenv", "SESSION_USER")));
 ELSE
   INSERT INTO xx_audit.INASTRBUD_AUD
     (IDNTYPBUDG,
      IDNBACC,
      IDNBUDGET,
      IDINASTRBUD,
      IDAUD,
      DML_TYPE,
      DML_TYPEU,
      TERMINAL,
      OS_USER,
      IP_ADRES,
      SESSION_USER)
   VALUES
     (:old.IDNTYPBUDG,
      :old.IDNBACC,
      :old.IDNBUDGET,
      :old.IDINASTRBUD,
      New_Idaud,
      "D",
      "",
      TRIM(Sys_Context("userenv", "TERMINAL")),
      TRIM(Sys_Context("userenv", "OS_USER")),
      TRIM(Sys_Context("userenv", "IP_ADDRESS")),
      TRIM(Sys_Context("userenv", "SESSION_USER")));
 END IF;
end INASTRBUD_AUD;


 
Sergey13 ©   (2010-02-03 11:10) [6]

> [5] Гость   (03.02.10 10:56)
на первый взгляд вроде все логично.
А если сделать три отдельных тригера на каждое действие?


 
Гость   (2010-02-03 11:12) [7]

пробовал, отрабатывает один, по последней команде


 
Кщд   (2010-02-03 13:33) [8]

триггеры аудита обычно вешают на after
а конкретно по теме: тест-кейс из sqlplus в студию, пожалуйста


 
Гость   (2010-02-03 15:24) [9]

Спасибо, все решилось!

Дело было в ошибке сравнения с NULL. Надо так:

 IF Updating THEN
   IF nvl(:old.IDNTYPBUDG, 0) <> nvl(:new.IDNTYPBUDG, 0) OR
      nvl(:old.IDNBACC, 0) <> nvl(:new.IDNBACC, 0) OR
      nvl(:old.IDNBUDGET, 0) <> nvl(:new.IDNBUDGET, 0) OR
      nvl(:old.IDINASTRBUD, 0) <> nvl(:new.IDINASTRBUD, 0) THEN


 
Sergey13 ©   (2010-02-03 15:42) [10]

> [9] Гость   (03.02.10 15:24)

А как это влияло на НЕсрабатывании на удаление? Или ты не удалял?


 
Ega23 ©   (2010-02-03 15:55) [11]

А как в Oracle Update работает?
У меня складывается глубокое убеждение, что в MSSQL он "в кишках" как delete-insert работает.


 
Anatoly Podgoretsky ©   (2010-02-03 16:01) [12]

> Ega23  (03.02.2010 15:55:11)  [11]

Update по сути такой и есть, а внутреннея реализация не интересна.


 
Кщд   (2010-02-03 18:33) [13]

Гость   (03.02.10 15:24) [9]
null = 0
с такой логикой далеко не уедешь
также, не ясно, зачем при update плодить две записи и почему в логе нет timestamp?
допустим, двойной вставкой при update страхуетесь от того, что два пользователя одновременно редактируют запись(а Вам, видимо, хочется видеть что менял пользователь и на что, на случай lost update), но как Вы собираетесь определять очередность изменений при таком подходе - совершенно непонятно
trim, опять же, где нужно и где не нужно

и принято сообщать, СУБД и версию
удачи)


 
ANB   (2010-02-04 12:30) [14]


> null = 0
> с такой логикой далеко не уедешь

Да ничего страшного вообще то


> также, не ясно, зачем при update плодить две записи

Вполне нормально. Старое и новое значение.

> но как Вы собираетесь определять очередность изменений при
> таком подходе

SELECT SEQ_INASTRBUD_AUD.NEXTVAL INTO New_Idaud FROM Dual;

Короче, вполне себе так нормальный триггер. Я бы еще поле для sysdate добавил - не помешает.

И стандартная ошибка при сравнении (забыли про null). Я так тоже люблю косячить. Правда, в последнее время уже очень редко.


 
Sergey13 ©   (2010-02-04 13:14) [15]

Насчет аудита я скажу так. Я бы трижды подумал на тему - а нужен ли он такой. Пробовал несколько раз делать такое - очень скоро аудитные таблицы начинают превосходить исходные по объему на порядки. При этом используется он ОЧЕНЬ (обычно) редко и не дает особо ничего. Ну нашли виновника, и что? "Ну ошибся я, с кем не бывает". И ВСЕ. Я бы просто добавил логин юзера и дату последней модификации записи в основную таблицу. В 99% случаев этогшо достаточно.

Разумеется в некоторых системах аудит необходим даже по закону, но обычно люди пишущие его не задают вопросов на форумах.

ИМХО

ЗЫ: Я так и не понял как влияло некорректное сравнение с нулом на секцию тригера про удаление.


 
Sergey13 ©   (2010-02-04 13:20) [16]

Плюсом про аудит.
В Оракле (насколько я понял это он) вроде как есть штатное средство по работе со штатными логами. Log Miner вроде называется. Я с ним не разбирался, но вроде как по отзывам вполне работоспособен. А логах оракла есть все.


 
Кщд   (2010-02-04 17:25) [17]

>ANB   (04.02.10 12:30) [14]
>Да ничего страшного вообще то
0!=null - логическая ошибка
т.о. при изменении 0 на null и обратно, изменение не будет учтено

>Вполне нормально. Старое и новое значение.
вопрос был "зачем"
если бездумно плодить данные - нормально, то остается только умыть руки

>SELECT SEQ_INASTRBUD_AUD.NEXTVAL INTO New_Idaud FROM Dual;
т.е. если ID2 > ID1, то изменения в ID2 - более поздние, так?

>Короче, вполне себе так нормальный триггер. Я бы еще поле для sysdate добавил - не помешает.
timestamp
и, желательно, с local time zone
впрочем, это уже излишество, но весьма полезное время от времени


 
Кщд   (2010-02-04 17:29) [18]

>Sergey13 ©   (04.02.10 13:20) [16]
logminer пишет IP пользователя?)

а если серьезно, то, например, на простенькой, некритичной базке с 3-5 таблиц никто не будет поднимать архивлоги - это просто ни к чему

да и с помощью sql работать куда как приятнее - опять же можно в софтину клиентскую привязать показ изменений


 
Кщд   (2010-02-04 20:49) [19]

>Sergey13 ©   (04.02.10 13:14) [15]
перечитал Ваш пост внимательно)

>Разумеется в некоторых системах аудит необходим даже по закону, но >обычно люди пишущие его не задают вопросов на форумах.
ещё как задают))
здесь ещё немного кода и специфичных названий полей/таблиц - есть примеры, когда выкладывают код в несколько десятков килобайт...
только когда(и если) работодатель видит потроха базы и кода в форуме - ни к чему хорошему для вопрошавшего это не приводит


 
Игорь Шевченко ©   (2010-02-05 00:55) [20]

RTFM Кулибиным:
http://download.oracle.com/docs/cd/B10500_01/server.920/a96521/audit.htm
http://www.oracle-base.com/articles/8i/Auditing.php
http://www.citforum.ru/database/oracle/audit/


 
Кщд   (2010-02-05 05:55) [21]

>Игорь Шевченко ©   (05.02.10 00:55) [20]
особенно хорош и гибок -  FGA
никто не спорит, да и пользовать его в той же 10-ке - очень удобно
вот только в обычной такой системе, где авторизация/аутентификация самописные(т.е. коннект происходит под одним пользователем Oracle), система разграничение прав своя и все изменения(DML) должны быть увязаны с OPERATION_LOG.ID(т.е. выполненной пользователем операции (или, например, идентификатором web-сессии), - все эти внутренние и, безусловно, эффективные инструменты несколько не к месту
другими словами, это, скорее, инструментарий dba, а не разработчика


 
Sergey13 ©   (2010-02-05 09:51) [22]

> [18] Кщд   (04.02.10 17:29)
> некритичной базке с 3-5 таблиц никто не будет поднимать
> архивлоги - это просто ни к чему

Для "некритичной базки" ни к чему юзать Оракл (хотя конечно не возбраняется 8-), и уж тем более прикручивать аудит. ИМХО.


 
ANB   (2010-02-05 10:05) [23]


> Для "некритичной базки" ни к чему юзать Оракл

А что юзать то ?
Оракл :
1) халявый
2) ставится за 5 минут задавая 3 вопроса
3) удобный


 
Sergey13 ©   (2010-02-05 10:30) [24]

> [23] ANB   (05.02.10 10:05)

Он просто тупо большой и достаточно сложный если в него смотреть.
Дистрибутив ФБ весит 2.5 метра и сервер и клиент. Сколько весит Оракл?


 
ANB   (2010-02-05 11:16) [25]


> Сколько весит Оракл?

212 метров.


 
Sergey13 ©   (2010-02-05 11:23) [26]

> [25] ANB   (05.02.10 11:16)

Ну вот и сравнивай почему

> [22] Sergey13 ©   (05.02.10 09:51)
> Для "некритичной базки" ни к чему юзать Оракл


 
Кщд   (2010-02-05 12:58) [27]

>Он просто тупо большой и достаточно сложный если в него смотреть.
>Дистрибутив ФБ весит 2.5 метра и сервер и клиент. Сколько весит Оракл?
зачем FB, когда нажав несколько раз на кнопку next получу нормальную поддержку xml, аналитические ф-ции, хранимый код на java, пользовательские типы, поддержку пользовательских типов, возможность работать с гео-объектами и др. и пр.?)


 
Кщд   (2010-02-05 13:08) [28]

>Sergey13 ©   (05.02.10 09:51) [22]
>Для "некритичной базки" ни к чему юзать Оракл (хотя конечно не >возбраняется 8-), и уж тем более прикручивать аудит. ИМХО.
уже писал, что с результатом работы logminer работать гораздо неудобнее, чем с sql-запросами, не говоря уже об объемах архивлогов...
да и разные это вещи - принципиально: пользователь хочет видеть, кто и когда выполнял операцию "перевод средств на счета доходов со счетов будущих доходов", а вовсе не изменения в 10-ти таблицах, которые были вызваны выполнением этой операции
также, администратор системы желает знать, какой пользователь системы выполнил эту операцию, а совсем не под каким пользователем Oracle она была выполнена


 
Sergey13 ©   (2010-02-05 13:09) [29]

> [27] Кщд   (05.02.10 12:58)

А это нужно для

> [18] Кщд   (04.02.10 17:29)
> некритичной базке с 3-5 таблиц

?

ЗЫ: Не надо убеждать меня в "классности" Оракла. 8-)


 
Игорь Шевченко ©   (2010-02-05 13:22) [30]

Кщд   (05.02.10 13:08) [28]


> пользователь хочет видеть, кто и когда выполнял операцию
> "перевод средств на счета доходов со счетов будущих доходов",
>  а вовсе не изменения в 10-ти таблицах, которые были вызваны
> выполнением этой операции
> также, администратор системы желает знать, какой пользователь
> системы выполнил эту операцию, а совсем не под каким пользователем
> Oracle она была выполнена


Сдается мне, что это автоматизация бардака


 
Sergey13 ©   (2010-02-05 13:35) [31]

> [28] Кщд   (05.02.10 13:08)

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

У тебя то "некритичной базке с 3-5 таблиц" то "изменения в 10-ти таблицах, которые были вызваны выполнением этой операции".
Ты уж как нибудь определись в своих предположениях. 8-)


 
Кщд   (2010-02-05 13:44) [32]

>Sergey13 ©   (05.02.10 13:09) [29]
>А это нужно для?
да, простейшая система онлайн-мониторинга автотранспорта
для хранения пользуем georaster, для обмена с внешними клиентскими местами  - xml
в случае падения базы, в течение 20мин поднимается из вчерашнего бэкапа и прокатывается оперативный лог за текущие сутки
т.о. 20-25мин и база снова в бою


 
Кщд   (2010-02-05 13:49) [33]

>Игорь Шевченко ©   (05.02.10 13:22) [30]
как угодно называйте
типовая банковская система
операция движения по счету может породить десятки других операций, соответственно, изменив не один десяток таблиц
теперь представьте, какую кашу выдаст FGA и уж тем более logminer в этом случае
а что хочет увидеть администратор системы? конечно, кто и когда запустил бизнес-операцию, а вовсе не кашу из изменений в массе таблиц


 
Кщд   (2010-02-05 13:54) [34]

>Sergey13 ©   (05.02.10 13:35) [31]
"некритичной базке с 3-5 таблиц" - было сказано к тому, что нецелесообразно поднимать архивлоги в некоторых случаях

"изменения в 10-ти таблицах, которые были вызваны выполнением этой операции" - этот тезис относился к необходимости в целях аудита логировать бизнес-операцию и связывать с ней конкретные изменения в таблицах, а не логировать бессвязные dml-изменения


 
Sergey13 ©   (2010-02-05 13:57) [35]

> [32] Кщд   (05.02.10 13:44)
> да, простейшая система онлайн-мониторинга автотранспорта
> [33] Кщд   (05.02.10 13:49)
> типовая банковская система

И тут Остапа понесло. (с)
8-)


 
Игорь Шевченко ©   (2010-02-05 14:09) [36]

Кщд   (05.02.10 13:49) [33]


> а что хочет увидеть администратор системы? конечно, кто
> и когда запустил бизнес-операцию, а вовсе не кашу из изменений
> в массе таблиц


на месте администратора я бы хотел увидеть, что бизнес-операции могут инциировать только те пользователи, которым это положено по штату, а попытки инициации операций другими пользователями блокировались бы на корню с обязательным аудитом заблокированной попытки, чтобы было кого палкой лупить. Подобное поведение реализуется стандартными средствами Oracle.


 
Кщд   (2010-02-05 14:32) [37]

>Игорь Шевченко ©   (05.02.10 14:09) [36]
в случае, если реализована система "запрещено всё то, что не разрешено", пользователь физически не сможет вызвать операцию, которой у него нет)
речь сейчас о самописной системе разграничения прав, а не о средствах Oracle
создание такой системы оправдано, например, тем, что никто не будет создавать пользователя Oracle для каждого посетителя/зарегистрированного пользователя сайта

и ещё: полезность и эффективность внутреннего аудита средствами Oracle не ставил под сомнение


 
Кщд   (2010-02-05 14:33) [38]

>Sergey13 ©   (05.02.10 13:57) [35]
32 и 33 ответы на разные вопросы
Вам нужен универсальный ответ?
пожалуйста, 40)


 
Игорь Шевченко ©   (2010-02-05 15:11) [39]


> речь сейчас о самописной системе разграничения прав


Том Кайт - рулез фарева


 
ANB   (2010-02-12 15:13) [40]


> Том Кайт - рулез фарева

И на солнце бывают пятна. Так что рулез, но ошибки в его книжке тоже есть.

Практика - вот рулез.

Поддерживаю Кщд. Многие встроенные вещи в оракл реализованы довольно громоздко, не всегда работоспособны и тяжеловаты в настройке. Частенько проще повесить простенький триггер и не мучится. Кстати, простенький триггер зачастую шустрее встроенных вещей.

Архив логи же - штука мощная, но не всегда удобная.
1) Они толстые, у нас их чистят каждый день, причем держат максимум 2 дня.
2) Разбираться в них повесишься.
3) Не всегда в них содержиться ВСЯ нужная информация хотя бы для того же логгирования.

И по поводу прав. Типичная ситуация. Есть 5 юзеров, которые отвечают за конкретный интерфейс. Никто другой вломиться туда не может. В какой то момент выясняется, что в системе сидят кривые данные, из-за того, что кто то что не так настроил или удалил. Первым делом начальство спрашивает - кого драть ? Тут простенькая таблица нам этого кого то вычисляет в течение минуты. Причем со всеми координатами - имя юзера ОС, IP, с какой машины в сети, под каким логином.



Страницы: 1 2 вся ветка

Текущий архив: 2011.11.27;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.011 c
15-1312526088
Kilkennycat
2011-08-05 10:34
2011.11.27
ФАС против смсной дискриминации


15-1312015859
PreDatoR
2011-07-30 12:50
2011.11.27
Операция прервана по таймауту


15-1312574516
oldman
2011-08-06 00:01
2011.11.27
Из беседы с Р. Бредбери


15-1311578284
Студент
2011-07-25 11:18
2011.11.27
Жизненные нравоучения.


2-1312295124
Tim
2011-08-02 18:25
2011.11.27
ресурсы в длл