391
Рис. 15.1 ERD диаграмма предметной области (English)
На схеме видно, что два пользователя: Certif_mgr и Licns_mgr имеют «общую» таблицу «Manufctr», с которой оба эти пользователя могут выполнять однотипные действия изменения данных в этой таблице. Для того чтобы знать, какой пользователь, какие действия по изменению данных выполнял, создадим таблицу manufactr_audit. В эту таблицу будем также заносить информацию о прежнем и новом значении строк таблицы manufctr, формируемых пользователями, имеющими право работы с ней.
Работа выполняется копированием нижеприводимых команд в окно SQL*Plus.
CREATE TABLE manufctr_audit ( CHANGE_TYPE CHAR(1) NOT NULL, CHANGED_BY VARCHAR2(10) NOT NULL, TIMESTAMP DATE NOT NULL, Old_ManuID NUMBER(5),
Old_Name VARCHAR2(25),
Old_Address VARCHAR2(35),
Old_Phone VARCHAR2(12),
New_ManuID NUMBER(5),
New_Name VARCHAR2(25),
New_Address VARCHAR2(35),
New_Phone VARCHAR2(12) );
Создадим синоним этой таблицы, чтобы к ней можно было обращаться без ввода имени схемы:
CREATE PUBLIC SYNONYM manufctr_audit FOR ch_cert.manufctr_audit;
Теперь создадим триггер, обеспечивающий занесение информации аудита в таблицу manufctr_audit:
CREATE OR REPLACE TRIGGER LogManufctr
BEFORE INSERT OR DELETE OR UPDATE ON Manufctr FOR EACH ROW
DECLARE v_ChangeType CHAR(1); BEGIN
IF INSERTING THEN v_ChangeType := 'I'; ELSIF UPDATING THEN
392
v_ChangeType := 'U'; ELSE
v_ChangeType := 'D'; END IF;
INSERT INTO Manufctr_audit (change_type, changed_by, timestamp,
old_manuid, old_name, old_address, old_phone, new_manuid, new_name, new_address, new_phone) VALUES
(v_ChangeType, USER, SYSDATE,
:old.manuid, :old.name, :old.address, :old.phone, :new.manuid, :new.name, :new.address, :new.phone); END LogManufctr;
/
Проверим выполнение аудита изменений в таблице manufctr_audit.
connect licns_mgr/licns_mgr@orcl
insert into manufctr values(3,'Наши друзья','Территория МИФИ','324-34-54');
update manufctr
set manuid=4, name='Их люди',address='Коломенское',phone='112-11-21'
where manuid=3;
delete from manufctr where manuid=4;
Так как привилегия просмотра таблицы «manufctr_audit» пользователям licns_mgr и certif_mgr не предоставлялась, просматривать таблицу manufctr_audit может ее «хозяин» ch_cert.
connect ch_cert/ch_cert@orcl select * from manufctr_audit;
C CHANGED_BY TIMESTAM OLD_MANUID OLD_NAME OLD_ADDRESS OLD_PHONE NEW_MANUID NEW_NAME NEW_ADDRESS NEW_PHONE
- ---------- -------- ---------- ------------------------- ----------------------------------- ------------ ---------- ------------
------------- ----------------------------------- ------------ |
|
|
|||
I LICNS_MGR |
21.05.10 |
|
3 |
Наши друзья |
|
Территория МИФИ |
324-34-54 |
|
|
|
|
U LICNS_MGR 21.05.10 |
|
3 |
Наши друзья |
||
Территория МИФИ |
324-34-54 4 |
Их люди Коломенское |
112-11-21 |
|
|
D LICNS_MGR |
21.05.10 4 |
Их люди Коломенское |
112-11-21 |
|
|
393
Выводимая информация позволяет проконтролировать выполнение аудита действий пользователей и показывает, кто, когда, какие действия по изменению таблицы «manufctr» выполнял и, что особенно важно, прежние и новые значения изменяемых строк этой таблицы.
2. Настройка и проверка в работе аудита действий пользователя встроенными средствами аудита СУБД Oracle, аудит действий пользователя с привилегией «sysdba»
в СУБД Oracle
Регистрация действий пользователей с объектами. Для регистра-
ции таких действий надо задействовать аудит – установить инициализационный параметр audit_trail в значение «DB» или «TRUE».
Connect sys/sys@orcl as sysdba
Проверим значение этого параметра командой:
Show parameter audit_trail
Если значение параметра «TRUE» или «DB», для очистки таблицы аудита Oracle выполним команду:
delete from aud$;
Теперь мы освободились от записей аудита предыдущих сеансов и можем продолжать работу «с чистого листа».
Если значение параметра «NONE», установим этот параметр в значение «TRUE» или «DB» и перестартуем инстанцию:
ALTER SYSTEM SET audit_trail=db SCOPE=SPFILE; Shutdown immediate
Startup
Проверим еще раз значение параметра audit_trail:
Show parameter audit_trail
Теперь выполним команду, включающую аудит таблицы
«manufctr»:
AUDIT select,insert,update,delete ON manufctr;
Убедимся, что таблица «aud$», регистрирующая аудит, пуста:
SELECT userid,ses$actions,obj$name FROM aud$;
Если же в ней есть записи, удалим их:
DELETE FROM aud$;
И проверим, как выполняется аудит действий с таблицей
«manufctr»:
394
connect licns_mgr/licns_mgr@orcl SELECT * FROM manufctr;
Посмотрим, зарегистрирован ли этот «select»:
Connect sys/sys@orcl as sysdba
SELECT userid,ses$actions,obj$name FROM aud$;
USERID |
SES$ACTIONS |
OBJ$NAME |
---------------- |
------------------- |
---------------- |
LICNS_MGR |
---------S------- |
MANUFCTR |
Знак «S» в столбце таблицы «aud$» говорит о том, что зареги- |
||
стрирован успешный «SELECT» к этой таблице; отметим, что этот знак занимает седьмую позицию справа в этом столбце; проверим выполнение двух команд «select» к таблице «manufctr» в одном сеансе, предварительно очистив таблицу aud$:
delete from aud$;
connect licns_mgr/licns_mgr@orcl
SELECT * FROM manufctr WHERE manuid=0; SELECT * FROM manufctr WHERE manuid=1;
Посмотрим, как зарегистрированы эти «SELECT»:
Connect sys/sys@orcl as sysdba
SELECT userid,ses$actions,obj$name FROM aud$; USERID SES$ACTIONS OBJ$NAME
----------------- ------------------- ------ ----------
LICNS_MGR ---------S------ MANUFCTR
Отсутствие новых строк в таблице «aud$» говорит о том, что в ней регистрируется факт выполнения «SELECT» в сеансе, но не регистрируется каждая из этих команд. Это объясняется тем, что команда «AUDIT select, insert, update, delete ON manufctr;» по умолчанию выполняется с опцией «BY SESSION». Выполним теперь эту команду с опцией «BY ACCESS», предварительно очистив таблицу «aud$»:
Connect sys/sys@orcl as sysdba DELETE FROM aud$;
AUDIT select, insert, update, delete ON manufctr BY ACCESS; connect licns_mgr/licns_mgr@orcl
SELECT * FROM manufctr WHERE manuid=0; SELECT * FROM manufctr WHERE manuid=1; Connect sys/sys@orcl as sysdba
Немного изменим запрос к таблице «aud$»:
395