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 '12345';
grant dba to U1;
alter user U1 level("CC", "NS");

username U1/12345
! <Метка доступа> таблицы ##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-значений, то отката добавления записи не произойдёт.