UPDATE, INSERT и MERGE операторы

< Метка доступа > в этих операторах может относиться как ко всей таблице (строке), например,

insert into auto< метка доступа > values (...);

так и отдельным полям, например,

insert into auto (PersonID< метка доступа >) values (10000);

В первом случае считается, что метка доступа относится ко всей строке, во втором – только к указанному полю.

Если пропущена < метка доступа > строки, то по умолчанию группа берется равной группе пользователя, а RAL-уровень и WAL-уровень устанавливаются как максимум RAL-уровня и WAL-уровня пользователя. Т.е. для пользователя U1 с < меткой доступа > #1#5#1 вносимые им данные будут иметь < метку доступа > #1#5#5.

Если в конструкции UPDATE для строки или для поля < метка доступа > не указана, она остается той же, что была до корректировки строки (поля), при условии, что определяемый ею уровень доступа разрешен пользователю для этой операции. В противном случае (когда, например, секретный пользователь меняет не секретные данные без указания уровней) выдается код завершения 1070 (Нарушение мандатного доступа).

Если задана < метка доступа > поля, то результирующий уровень доступа для поля и для записи устанавливается как максимум уровней записи и поля.

Пример.

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 or replace user U1 identified by '12345678';
grant dba to U1;
alter user U1 level("CC", "NS");

username U1/12345678
! < Метка доступа > таблицы ##5#1
create or replace table tab1 (id int LEVEL("CC","C"), name char(10)
 LEVEL("CC","C"));

! < Метка доступа > записи/полей ##4#4
insert into TAB1##"C"#"C"(ID##"C"#"C",NAME##"C"#"C") values (101,'qwerty');
! < Метка доступа > записи/полей ##4#4
insert into TAB1##"S"#"S"(ID##"C"#"C",NAME##"C"#"C") values (102,'abcd');
! < Метка доступа > записи/полей ##4#4
insert into TAB1##"C"#"DSP"(ID##"C"#"C",NAME##"C"#"C") values (103,'zzzzzzzz');
insert into
! < Метка доступа > записи/полей ##5#5
TAB1(ID##"C"#"C",NAME##"C"#"C") values (104,'new');
! < Метка доступа > записи/полей ##5#5
insert into TAB1 values (105,'new2');

Примечания

  1. Если для обновляемой таблицы задан псевдоним, то спецификация мандатной защиты должна стоять после этого псевдонима.

    update < имя таблицы >[AS < псевдоним >] [#[< группа >]#[< RAL >]#[< WAL >]]

  2. При добавлении новой записи с BLOB-значениями вставка BLOB-значений считается отдельной операцией и в случае, если в режиме AUTOCOMMIT ошибка произойдёт при вставке BLOB-значений, то отката добавления записи не произойдёт.