Управление мандатной защитой на уровне сессии

Для того чтобы не указывать группу, RAL и WAL в каждом INSERT- или UPDATE-запросе, выполняемом пользователем в текущей сессии, можно использовать команду:

SET SESSION DEFAULT SECURITY #[< группа >]#[< RAL >]#[< WAL >];

Команда распространяется на все открытые дочерние каналы (которые уже открыты ранее или будут открыты впоследствии).

Пример.

create level "NS" = 1;
create level "DSP" = 2 ;
create level "C" = 3;
create level "CC" = 4;

drop user "TEST" cascade;
create user "TEST" identified by '12345678';
grant DBA to "TEST";
username TEST/12345678
create or replace table a (i int, j int);
! TEST FOR 'INSERT'
insert into a values(1,1);
username SYSTEM/MANAGER8
alter user TEST level ("DSP","DSP");
username TEST/12345678
insert into a values(2,2);
!ok
set session default security ##C#C;
insert into a values(3,3);
!ok
set session default security ##CC#CC;
insert into a values(4,4);
!2 rows
select security(*,'R'),security(*,'W') from a;
username SYSTEM/MANAGER8
alter user TEST level ("CC","CC");
username TEST/12345678
!4 rows
select security(*,'R'),security(*,'W') from a;
! TEST FOR 'UPDATE'
update a set i=10,j=10 where i=1;
!4 rows
select security(*,'R'),security(*,'W') from a;
!error: MandatoryViolation
set session default security ##NS#NS;

SET SESSION SECURITY #[< группа >]#[< RAL >]#[< WAL >];

В отличие от команды SET SESSION DEFAULT SECURITY, данная команда влияет не на метки доступа в INSERT- или UPDATE-запросах, а устанавливает в канале метку доступа для работы с объектами БД – таблицами, представлениями и т.д. (по умолчанию эта метка берется равной метке уровня пользователя). Т.е. с меткой доступа, установленной командой set session security, будут выполняться любые запросы по этому каналу. Команда также распространяется на все дочерние каналы (которые уже открыты ранее или будут открыты впоследствии).

Устанавливаемый командой уровень чтения должен быть не больше установленного в канале уровня чтения (по умолчанию он берется равным RAL-уровню доступа пользователя).

Устанавливаемый командой уровень записи должен быть не меньше установленного в канале уровня записи (по умолчанию он берется равным WAL-уровню доступа пользователя).

Для команд SET SESSION DEFAULT SECURITY и SET SESSION SECURITY можно пропускать задание группы и уровней.

При попытке смены группы в команде SET SESSION SECURITY будет выдан код завершения 1070 (Нарушение мандатного доступа) (т.к. в другой группе мы работать не можем), хотя для команды SET SESSION DEFAULT SECURITY такой код завершения выдаваться не будет (т.к. мы можем внести БД данные для другой группы).

Пример.

create if not exists level "NS"   = 1;
create if not exists level "DSP"  = 2;
create if not exists level "S"  = 3;
create if not exists level "C" = 4;
create if not exists level "CC" = 5;

drop user U1 cascade;
create user U1 identified by '12345678';
grant dba to U1;
alter user U1 level("CC", "NS");

username U1/12345678
drop table TAB1 cascade;
set session security ##4#4;
! ошибка 1022
create table tab1 (id int, name char(10)) LEVEL("NS","NS" );
! ошибка 1070
set session security ##4#3;
! ошибка 1070
set session security ##5#4;
! ошибки нет
set session security ##3#4;
create or replace table tab1 (id int, name char(10));

username U1/12345678
< Метка доступа > записи/полей ##3#4
insert into TAB1##3#4 values (104,'new4');
< Метка доступа > записи/полей ##4#4
insert into TAB1##4#4 values (105,'new5');
set session security ##5#1;
< Метка доступа > записи/полей ##5#5
insert into TAB1 values (106,'new6');