Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2011.11.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
Гость   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.015 c
15-1312562196
NailMan
2011-08-05 20:36
2011.11.27
Как я стал мультитриллионером


2-1312707821
Gu
2011-08-07 13:03
2011.11.27
dcu


1-1274354204
Dodjik
2010-05-20 15:16
2011.11.27
FastReports->rtf - проблема с подгоном картинки


2-1312416987
Псарь
2011-08-04 04:16
2011.11.27
Архитектура в CAD-системе. Изображения.


15-1311971398
Юрий
2011-07-30 00:29
2011.11.27
С днем рождения ! 30 июля 2011 суббота





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский