powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Аудит
7 сообщений из 7, страница 1 из 1
Аудит
    #32072705
новый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кореша, просто погибаю
кто может помочь, как в Оракле выставить аудит так что бы он сносил всю информацию о коннектах к базе данных в табилицу....
...
Рейтинг: 0 / 0
Аудит
    #32072715
Доброжелатель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Кореша, просто погибаю
>кто может помочь, как в Оракле выставить аудит так что
>бы он сносил всю информацию о коннектах к базе данных
>в табилицу....

Доку читать не пробовал? Иногда излечивает.
...
Рейтинг: 0 / 0
Аудит
    #32072729
DimaR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот сегодня пришло, копай где то там

Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
Триггеры на операторы ЯОД и аудит изменений структуры базы

Уважаемые подписчики! Этот выпуск, как и было обещано, посвящен появившимся в версии 8i
триггерам на операторы ЯОД и их использованию для реализации аудита изменений структуры 
базы данных. Продолжаем изучать наработки Тома
Кайта...



Триггеры на операторы ЯОД в Oracle

Привет,

Мой вопрос связан с триггерами на операторы ЯОД (DDL triggers), возможности которых
существенно расширены в версии  8 . 1 . 7  по сравнению с  8 . 1 . 6 .

 Однако по-прежнему информации об операторе ЯОД, вызвавшем срабатывание триггера, очень
мало.

Не знаете ли вы какого-нибудь фокуса, который позволил бы увидеть весь текст оператора
ЯОД (да, с конструкцией хранения и другими подробностями...)?

Я думаю об извлечении текста из представления v$SQLAREA, но там появляются
только операторы ALTER.

 Идеи есть?

 Ответ Тома Кайта:

Вы можете читать любое представление словаря данных. Но текст оператора CREATEпрочитать ни откуда нельзя.
Операторы DROP читать вообще не надо (их можно
воссоздать и так). Операторы ALTER получить можно (но не забывайте, - некоторые
операторы ALTER, на замом деле, замаскированные операторы CREATE!!!alter table t add constraint - это, на самом
деле, CREATE constraint).

 Например:



tkyte@TKYTE816>; create table log
   2   (operation varchar2( 25 ),
   3    owner     varchar2( 25 ),
   4    name      varchar2( 25 ),
   5    extra     varchar2( 4000 )); 
  
Table created. 
  
tkyte@TKYTE816>; create or replace trigger ddl_trigger
   2   after create or alter or drop on SCHEMA3  declare
   4       l_sysevent varchar2( 25 );
   5       l_extra    varchar2( 4000 );
   6   begin
   7       select ora_sysevent into l_sysevent from dual;
   8 
   9       if (l_sysevent in ('DROP', 'CREATE'))
  10       then
  11           if l_sysevent = 'CREATE'
  12           then
  13           begin
  14               select 'storage (initial ' || initial_extent ||
  15                      ' next ' || next_extent || ' ....)'
                   into l_extra
  16                 from all_tables
                  where table_name = ora_dict_obj_name
  17                  and owner = user;
  18           exception
  19               when no_data_found then null;
  20           end;
  21           end if;
  22 
  23           insert into log
  24           select ora_sysevent, ora_dict_obj_owner,
  25                          ora_dict_obj_name, l_extra
  26             from dual;
  27       elsif (l_sysevent = 'ALTER')
  28       then
  29           insert into log
  30           select ora_sysevent, ora_dict_obj_owner,
  31                          ora_dict_obj_name, sql_text
  32             from v$open_cursor
  33            where upper(sql_text) like 'ALTER%'  ||
  34                                 ora_dict_obj_name || '%'
  35              and sid = (select sid
  36                           from v$session
  37                          where audsid=userenv('sessionid'));
  38       end if;
  39   end;
  40   /
 
Trigger created.
 
tkyte@TKYTE816>; drop table t;

Table dropped. 

tkyte@TKYTE816>; create table t ( x int );

Table created. 

tkyte@TKYTE816>; alter table t add y date;

Table altered. 

tkyte@TKYTE816>; select * from log; 

OPERATION OWNER NAME EXTRA
 --------- ----- ---- -------------------------------------------
 
DROP      TKYTE T
CREATE    TKYTE T    storage (initial  131072  next  131072  ....)
ALTER     TKYTE T    alter table t add y date





Комментарий читателя от  4  декабря  2001  года

Привет, Том!

Твой ответ был очень полезен.

Я создал  "DDL_TRIGGER"  по твоему примеру, и он отлично работает, вставляя
подробности в таблицу LOG. Но при удаленном выполнении операторов ЯОД любым 
другим пользователем, имеющим соответствующие привилегии в моей схеме, эти изменения
триггером не перехватываются... Я понимаю, что этот триггер ограничен уровнем
схемы. Но чтобы избежать использования подсистемы аудита, я хотел бы использовать
подобный триггер. Не могли бы вы посоветовать, как отслеживать операторы ЯОД, 
выполняемые в данной схеме любым привилегированным пользователем?

Ответ Тома Кайта

Надо создавать триггер на операторы ЯОД на уровне базы данных (DATABASE level DDL trigger),
который будет учитывать, в какой схеме находится соответствующий объект. Следить надо
за всеми операторами ЯОД, а перехватывать - только те, которые вас интересуют.

Комментарий читателя от  19  декабря  2001  года

Можно ли отслеживать операторы select для таблицы с помощью триггеров
вида:

Create or replace trigger for select

Ответ Тома Кайта

Нет, в 8i - нет. В 8i можно выполнять аудит операторов select, а в 9i есть
детальный аудит, который дает новый уровень функциональности (очень похожий на
представленный вами  "триггер на select" ).

Комментарий читателя от  15  января  2002  года

Привет, Том!

Большое спасибо за это обсуждение. Я использовал твой пример для создания собственного
триггера на базу данных для отследивания операторов ЯОД, и он отлично работает.

Однако есть ряд исключений, которые сбивают с толку этот триггер. Одно их исключений,
с которым я столкнулся - это когда в таблицу должна быть вставлена строка из-за перекомпиляции
недействительного триггера (произошло событие alter). Однако, она в представленииv$open_cursor соответствующей
информации нет, что приводит к возбуждению
исключительной ситуации no_data_found. Сейчас я использую обработчик,
игнорирующий эту исключительную ситуацию. Нет ли решения получше?.

Не подскажешь ли также, как отличить оператор alter xxx compile от
действительного изменения объекта? При изменении одного объекта, зависимые от него
объекты перекомпилируются, и обновляется также значение в столбце last_ddl_time представления dba_objects для
этих зависимых объектов. Итак, как можно
выявить эту ситуацию по словарю данных?

Ответ Тома Кайта

Перейдите на версию 9i, и сможете получать вызвавший срабатывание оператор с помощью
вызова функции...

Если нет текста в v$open_cursor в журнал аудита ничего записывать не надо.

Комментарий читателя от  16  января  2002  года

А как можно получить тело триггера или его код по словарю данных?

Ответ Тома Кайта

Этот сценарий подходит для многих случаев:



set echo off
set long  50000 
set verify off
set feedback off
set termout off
set heading off
set pagesize  0 

spool   1 ..sql select
'create or replace trigger "' ||
         trigger_name || '"' || chr( 10 )||
 decode(substr( trigger_type,  1 ,  1 ),
        'A', 'AFTER', 'B', 'BEFORE', 'I', 'INSTEAD OF') ||
              chr( 10 ) ||
 triggering_event || chr( 10 ) ||
 'ON "' || table_owner || '"."' ||
       table_name || '"' || chr( 10 ) ||
 decode(instr( trigger_type, 'EACH ROW'),  0 , null,
            'FOR EACH ROW') || chr( 10 ) ,
 trigger_body
from user_triggers
where trigger_name = upper(' 1')
/
prompt /

spool off
set verify on
set feedback on
set termout on
set heading on





Комментарий читателя от  8  марта  2002  года

Привет, Том!

Мне очень понравился сценарий ddl_triger. У нас есть одна основная база данных
и множество пользователей, ее использующих и изменяющих, так что действительно
необходимо создавать триггер на уровне базы данных, чтобы контролировать изменения. 
Недавно я обнаружил, что в таблицу log вносятся записи при изменении пароля
пользователем. Интересно, нельзя ли избавиться от записей, связанных с изменением пароля?

Ответ Тома Кайта

Это же ваш триггер - перепишите его, чтобы он делал то, что нужно!

 Вместо



 29           insert into log
  30           select ora_sysevent, ora_dict_obj_owner,
  31                          ora_dict_obj_name, sql_text
  32             from v$open_cursor
  33            where upper(sql_text) like 'ALTER%'  ||
  34                                 ora_dict_obj_name || '%'
  35              and sid = (select sid
  36                           from v$session
  37                          where audsid=userenv('sessionid')); 





выбирайте sql_text и если он соответствует шаблону'ALTER%USER%IDENTIFIED%BY%' - выбирайте подстроку и помещайте
в таблицу logтолько ее.

Я также хочу подчеркнуть, что в 9i есть функция, ora_sql_text, выдающая
текст оператора, вызвавшего срабатывание триггера, и с помощью этой функции
перехватывать подобного рода операторы в 9i будет намного проще.

Комментарий читателя от  11  апреля  2002  года

Я не знаю, почему, но при попытке создания триггера я получил сообщение об
ошибке:



( 1 ):PL/SQL: ORA- 00942 : table or view does not exit





Ответ Тома Кайта

Почитайте
 
http://osi.oracle.com/~tkyte/Misc/RolesAndProcedures.html 

чтобы понять зачем, а потом подключитесь как sys или пользователь с привилегиейsysdba, выполните:



grant select on v_$open_cursor to ВЛАДЕЛЕЦ_ТРИГГЕРА;
grant select on v_$session to ВЛАДЕЛЕЦ_ТРИГГЕРА;





и попытайтесь еще раз.



Оригинал обсуждения этого вопроса можно найтиздесь.



Аудит операторов ЯОД

Привет, Том!

Я пытаюсь реализовать аудит операторов ЯОД с помощью новых триггеров уровня схемы
в 8i на события создания, удаления и изменения объектов. Я прочитал представленныйпример триггера и он мне очень
помог.

Мой вопрос связан, собственно, с документированием операторов alter. В нашей БД 
изменения объектов схемы выполняются с помощью  "alt-сценариев" , которые запускают в sqlplus.
Сценарий для удаления/добавления столбца таблицы может называться, например, 
 "customer.1 . 1 .alt", где customer - имя таблицы, а две цифры представляют, 
соответственно, номер версии и порядковый номер alt-сценария. Если ли способ получить
реальное имя сценария из таблицы словаря данных Oracle, системной переменной или переменной
контекста так, чтобы при каждом выполнении сценария его имя могло вставляться в таблицуddl_audit? Это, конечно,
пригодилось бы и для операторов create и drop,
но имена этих сценариев легко построить по значениям в ora_sysevent,ora_dict_obj_name и ora_dict_obj_type.

Я могу помещать имя сценария в комментарии в тексте сценария, а затем извлекать его
из поля sql_text представления v$open_cursor, но поле sql_text имеет длину только  60  символов, поэтому я теряю
необходимые части sql_text и 
вынужден встраивать комментарии, что неэлегантно, например:

alter table customer  /*customer.1.1.alt*/ 
drop column obsolete_column;

Я бы хотел элегантно извлекать откуда-нибудь имя, следующее за символом 
'@', например, @'customer.1.1.alt', в переменную в триггере для любых
сценариев, выполняемых в среде sqlplus и вызывающих срабатывание триггера на уровне схемы.

Ответ Тома Кайта

Если для установки используется sqlplus, элегантное решение существует. Утилита
sqlplus вставляет имя и даже глубину вложенности текущего сценария в столбец MODULEпредставления v$session.
Рассмотрим пример:



ops$tkyte@ORA817DEV.US.ORACLE.COM>; create table log
   2   (operation varchar2( 25 ),
   3    script    varchar2( 255 ),
   4    owner     varchar2( 25 ),
   5    name      varchar2( 25 ),
   6    extra     varchar2( 4000 ));

Table created. 

ops$tkyte@ORA817DEV.US.ORACLE.COM>; create or replace trigger ddl_trigger
   2   after create or alter or drop on SCHEMA
   3   declare
   4       l_sysevent varchar2( 25 );
   5       l_extra    varchar2( 4000 );
   6   begin
   7       select ora_sysevent into l_sysevent from dual;
   8 
   9       if (l_sysevent in ('DROP','CREATE'))
  10       then
  11           if l_sysevent = 'CREATE'
  12           then
  13           begin
  14               select 'storage (initial ' || initial_extent ||
  15                      ' next ' || next_extent || ' ....)'
  16                 into l_extra
  17                 from all_tables
  18                where table_name = ora_dict_obj_name
  19                  and owner = user;
  20           exception
  21               when no_data_found then null;
  22           end;
  23           end if;
  24 
  25           insert into log
  26           select ora_sysevent, module, ora_dict_obj_owner,
  27                          ora_dict_obj_name, l_extra
  28             from v$session
  29                    where sid = (select sid from v$mystat where rownum= 1 );
  30       elsif (l_sysevent = 'ALTER')
  31       then
  32           insert into log
  33           select ora_sysevent, module, ora_dict_obj_owner,
  34                          ora_dict_obj_name, sql_text
  35             from v$open_cursor,
  36                  (select module
  37                     from v$session
  38                    where sid = (select sid from v$mystat where rownum= 1 ))
  39            where upper(sql_text) like 'ALTER%'  ||
  40                                 ora_dict_obj_name || '%'
  41              and sid = (select sid
  42                            from v$session
  43                           where audsid=userenv('sessionid'));
  44       end if;
  45   end;
  46   / 
 
Trigger created.

ops$tkyte@ORA817DEV.US.ORACLE.COM>; create table cust (x int primary key);

Table created.

ops$tkyte@ORA817DEV.US.ORACLE.COM>; @customer. 1 . 1 .alt
ops$tkyte@ORA817DEV.US.ORACLE.COM>; alter table cust add new_column number; 

Table altered. 

ops$tkyte@ORA817DEV.US.ORACLE.COM>; column script format a25
ops$tkyte@ORA817DEV.US.ORACLE.COM>; column extra format a50
ops$tkyte@ORA817DEV.US.ORACLE.COM>; select script, extra from log;

SCRIPT                    EXTRA
 ------------------------- --------------------------------------------------
 
 01 @ test.sql
 01 @ test.sql              storage ( initial  524288  next  524288  .... )
 02 @ customer. 1 . 1 .alt      alter table cust add new_column number





Комментарий читателя от  9  ноября  2002  года

Привет, Том!

Это очень полезный пример. Если ты не против вопроса в догонку, где лучше всего искать информацию
о том что содержится в столбцах представлений словаря данных? Я бы хотел в этом разобраться.
Мне кажется, описание в документации Oracle несколько сжато, хотя, может, я не там смотрел. 
Еще раз спасибо за помощь и поддержку такого полезного и информативного сайта.

Ответ Тома Кайта

Я всегда пользуюсь следующим источником:

http://technet.oracle.com/docs/products/oracle9i/doc_library/release2/nav/docindex.htm#index-REF 

но лакомые кусочки типа:

  "А, кстати, в столбце MODULE представления v$session будет
находиться имя сценария sqlplus, если сеанс использует sqlplus." 

вы вряд-ли вообще где0нибудь найдете. 

В справочном руководстве об этом не будет написано, потому что это свойство/возможность SQL*Plus. 
Столбец module содержит значение, которое подключенное к базе данных приложение туда вставило.
Я по опыту знаю, что sqlplus вставляет туда имя сценария.   "Найти"  этот факт нигде не удастся.

Комментарий читателя от  11  ноября  2002  года

Есть ли подобный встроенный механизм в версии 9i?

Ответ Тома Кайта

Представленный пример работает и в 9i, но может понадобиться добавить в сценарий команду

 

set appinfo on





поскольку стандартное его значение, похоже, изменилось.

...
Рейтинг: 0 / 0
Аудит
    #32072836
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просьба для DimaR: Не публикуйте пожалуйста такие большие тексты, в которых тем более очень много мусора.
Лучше давайте ссылку. Или отвечайте сами конкретно, если можете.
...
Рейтинг: 0 / 0
Аудит
    #32073686
oracle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
короче парни почитал я ваши ответы, фигня полная вы что парню помочь не можете....
Жаль... (или вам жаль своих знаний, тогда вам тут не место..., или просто нечего сказать а хочется...)

Короче включи аудит на сессию

audit on session

(вроде так, точно не помню)

и смотри sys.aud$
...
Рейтинг: 0 / 0
Аудит
    #32073688
oracle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
работал я обычно разработчиком
знаю все от и до...
Но вот надо теперь поодминить, короче на новую контору устроился и надо произвести репликацию,

...
Ребята что это такое, где могу прочитать и как это использовать (а то просто перед боссом неудобно...)
...
Рейтинг: 0 / 0
Аудит
    #32073699
DimaR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To: Oracle
А чем не нравиться тригер на database_event?
Более гибко и ...

To: softbuilder@inbox.ru
ссылки у меня небыло, а писать самому лень, когда есть написаный кем то кусок
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Аудит
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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