LINTER от 04.02.15
.pdfПрактическое занятие 7 |
|
Разграничение доступа в СУБД ЛИНТЕР. Мандатный доступ |
41 |
7.4. Создание и назначение групп пользователей
Задача: Объединить пользователей A и B в группу G1, а пользователей C и D включить в группы G2 и G3 соответственно.
Для этого сначала создадим группы G1, G2 и G3. Пример:
CREATE GROUP G1;
Теперь назначаем группы пользователям. Пример:
ALTER USER A GROUP G1;
Теперь, подав SELECT из представления USER_SECURITY, видим в столбце SGR назначенные группы.
7.5. Создание объектов БД
Задача: Создать несколько таблиц с разными уровнями доступа от имени разных пользователей:
Владелец |
Таблица |
RAL таблицы и |
WAL таблицы и |
|
|
всех столбцов |
всех столбцов |
B |
TB(I INT, C CHAR(20)) |
НЕСЕКРЕТНО |
НЕСЕКРЕТНО |
C |
TC(D DATE, T CHAR(20)) |
ДСП |
НЕСЕКРЕТНО |
D |
TD(I INT, D DATE) |
ДСП |
ДСП |
Пример:
SQL>username D/ SQL>CREATE TABLE TD(
I INT LEVEL(“ДСП”, “ДСП”),
D DATE LEVEL(“ДСП”, “ДСП”)) LEVEL(“ДСП”, “ДСП”);
Заметим, что пользователь D не может создать таблицу с RAL ниже «ДСП» - это не позволяет сделать его WAL. Такой запрос
CREATE TABLE TD2(
I INT,
D DATE) LEVEL(“НЕСЕКРЕТНО”, “ДСП”);
вызовет ошибку нарушения привилегий.
Указание: т.к. пользователь С не имеет категории DBA, он не может явно указывать уровни при создании таблицы. Уровни его таблицы берутся по умолчанию по его собственным RAL и WAL.
Проверьте назначенные таблицам уровни, подав из-под SYSTEM запрос:
select * from table_security where tabname in ('TB','TC','TD');
Назначьте все привилегии на все созданные таблицы для всех пользователей. Это позволит лучше увидеть работу мандатного доступа, т.к. по дискреционному доступу всем пользователям будет все разрешено.
E-mail: market@relex.ru |
ЗАО НПП «РЕЛЭКС» |
http://www.relex.ru |
|
|
|
E-mail: market@relex.ru |
ЗАО НПП «РЕЛЭКС» |
http://www.relex.ru |
Практическое занятие 7 42 Разграничение доступа в СУБД ЛИНТЕР. Мандатный доступ
Пример:
GRANT ALL ON TB TO PUBLIC;
7.6. Добавление данных
Задача: Подать серию запросов на добавление данных в созданные таблицы из-под разных пользователей:
Пользователь |
Таблица |
RAL,WAL данных |
Результат |
B |
TB |
по умолчанию |
успешно |
B |
TB |
НЕСЕКРЕТНО, ДСП |
успешно |
B |
TB |
НЕСЕКРЕТНО, |
успешно |
|
|
НЕСЕКРЕТНО |
|
A |
TB |
по умолчанию |
успешно |
A |
TB |
СЕКРЕТНО, ДСП |
успешно (можно повысить |
|
|
|
уровень заносимых данных) |
C |
TC |
по умолчанию |
успешно |
C |
TC |
НЕСЕКРЕТНО, |
успешно (WAL пользователя |
|
|
НЕСЕКРЕТНО |
позволяет понизить уровень |
|
|
|
чтения) |
B |
TC |
по умолчанию |
нарушение мандатного |
|
|
|
доступа: между группами |
|
|
|
пользователей нет доверия |
D |
TD |
по умолчанию |
успешно |
D |
TD |
НЕСЕКРЕТНО, ДСП |
нарушение мандатного |
|
|
|
доступа |
D |
TD |
ДСП, ДСП |
успешно (минимальные |
|
|
|
уровни, которые может |
|
|
|
занести пользователь |
Пример запроса с указанием уровней:
insert into b.tb##"СЕКРЕТНО"#"ДСП" values(2,'2-A');
Примечание: Примеры всех запросов приведены в файле ins.sql
7.7. Выборка данных
Задача: Просмотреть добавленные данные под разными пользователями:
|
Пользователь |
Запрос |
|
Описание |
|
|
|
B |
select tb.*, security(*,'R') RAL |
Пользователь видит 5 сток. Получаем |
|||
|
|
from tb; |
|
также их RAL. 3 строки несекретные, 2 - |
||
|
|
|
|
секретные |
|
|
|
A |
select * from b.tb; |
|
Пользователь видит только 3 |
||
|
|
|
|
несекретные строки |
|
|
|
A |
select sum(i) from b.tb; |
При подсчете агрегатных функций тоже |
|||
|
|
|
|
учитываются только видимые строки |
||
|
E-mail: market@relex.ru |
ЗАО НПП «РЕЛЭКС» |
http://www.relex.ru |
|||
|
|
|
|
|
|
|
Практическое занятие 7 |
|
Разграничение доступа в СУБД ЛИНТЕР. Мандатный доступ |
43 |
B |
select * from c.tc; |
Нарушение мандатного доступа: таблица |
|
|
принадлежит другой группе |
C |
select tc.*, security(*,'R') RAL, |
Видим 2 добавленные строки и их уровни |
|
security(*,’W’) WAL from tc; |
|
D |
select td.*, security(*,'R') RAL, |
Видим 2 добавленные строки и их уровни |
|
security(*,’W’) WAL from td; |
|
7.8. Установка доверия между группами
Задача: Установить доверие группы G2 к группе G1. Решение: АБ (SYSTEM) подает запрос
GRANT ACCESS ON G2 TO G1;
Задача: Проверить возможность доступа пользователей разных групп к объектам и данным группы G2.
Пользо- |
Таблица |
Действие |
Результат |
ватель |
|
|
|
B |
TC |
выборка данных (select *) |
теперь видим строки |
B |
TC |
вставка строки с (RAL,WAL) по |
успешно |
|
|
умолчанию |
|
B |
TC |
вставка строки с (RAL,WAL) |
успешно |
|
|
“НЕСЕКРЕТНО”, “НЕСЕКРЕТНО” |
|
B |
TC |
выборка данных с информацией |
Видны старые и новые строки с |
|
|
о группе: |
разными RAL; метки групп |
|
|
select c.tc.*, security(*,’G’) GR, |
отличаются для строк, |
|
|
security(*,’R’) RAL from c.tc; |
добавленных разными |
|
|
|
пользователями |
A |
TC |
выборка данных (select *) |
нарушение мандатного доступа: |
|
|
|
RAL пользователя ниже, чем RAL |
|
|
|
таблицы |
C |
TC |
выборка данных (select *) |
пользователь видит только 2 |
|
|
|
строки, т.к. группа G1 не |
|
|
|
оказывала доверия его группе |
B |
|
GRANT ACCESS ON G1 TO G2; |
B является DBA группы G1 и |
|
|
|
может оказать доверие другой |
|
|
|
группе |
C |
TC |
выборка данных (select *) |
теперь пользователь видит три |
|
|
|
строки (одна ему по-прежнему |
|
|
|
недоступна вследствие высокого |
|
|
|
RAL) |
D |
TC |
выборка данных (select *) |
нарушение мандатного доступа: |
|
|
|
группе G3 не было оказано |
|
|
|
доверие |
7.9. Модификация/удаление данных
Задача: Выполнить несколько запросов на модификацию/удаление данных (осмыслить случаи разрешенных и запрещенных действий; проверить получающиеся после модификации метки доступа):
E-mail: market@relex.ru |
ЗАО НПП «РЕЛЭКС» |
http://www.relex.ru |
|
|
|
E-mail: market@relex.ru |
ЗАО НПП «РЕЛЭКС» |
http://www.relex.ru |
Практическое занятие 7 44 Разграничение доступа в СУБД ЛИНТЕР. Мандатный доступ
|
Пользо- |
Таблица |
Действие |
Результат |
|
|||
|
ватель |
|
|
|
|
|
|
|
|
B |
TC |
обновить строку, внесенную пользователем |
видим, что сменилась |
|
|||
|
|
|
|
C. Уровни доступа не указывать. Например: |
группа, а также |
|
||
|
|
|
|
|
|
повысился RAL строки |
|
|
|
|
|
|
update c.tc set t=’B modif’ where t=’1-C’; |
(согласно RAL |
|
||
|
|
|
|
|
|
пользователя B) |
|
|
|
|
|
|
просмотреть полученные строки с группами |
|
|
|
|
|
|
|
|
и уровнями: |
|
|
|
|
|
|
|
|
select c.tc.*, security(*,’G’) GR, security(*,’R’) |
|
|
|
|
|
|
|
|
RAL, |
security(*,’W’) WAL from c.tc; |
|
|
|
|
B |
TC |
понизить RAL обновленной строки и колонки |
RAL строки и колонки T |
|
|||
|
|
|
|
T до «ДСП» |
понизился, RAL |
|
||
|
|
|
|
|
|
колонки D остался |
|
|
|
|
|
|
update c.tc##"ДСП"# set T##"ДСП"# = T |
прежним |
|
||
|
|
|
|
where T='B modif'; |
|
|
|
|
|
|
|
|
просмотреть полученные строки с уровнями |
|
|
|
|
|
|
|
|
RAL и WAL и уровнями RAL столбцов: |
|
|
|
|
|
|
|
|
select c.tc.*, security(*,'R') RAL, security(*,'W') |
|
|
|
|
|
|
|
|
WAL, |
|
|
|
|
|
|
|
|
security(D,'R') DRAL, security(T, 'R') TRAL |
|
|
|
|
|
|
|
|
from c.tc; |
|
|
|
|
|
C |
TC |
выборка данных (select *) |
видим только 2 строки |
|
|||
|
C |
TC |
выборка столбца (select T) |
видим 3 строки, т.к. |
|
|||
|
|
|
|
|
|
RAL был понижен |
|
|
|
B |
TC |
повысить WAL поля T в строке до |
WAL поля повысился |
|
|||
|
|
|
|
«СЕКРЕТНО»: |
|
|
|
|
|
|
|
|
update c.tc##”ДСП”# set |
|
|
|
|
|
|
|
|
T##”ДСП”#”СЕКРЕТНО” = T where T='B |
|
|
|
|
|
|
|
|
modif'; |
|
|
|
|
|
|
|
|
проверим: |
|
|
|
|
|
|
|
|
select security(T,’W’) from c.tc where T='B |
|
|
|
|
|
|
|
|
modif'; |
|
|
|
|
|
C |
TC |
Попытка обновить значение поля T в этой |
Обновлено/удалено 0 |
|
|||
|
|
|
|
строке: |
строк: уровень |
|
||
|
|
|
|
|
|
ценности поля |
|
|
|
|
|
|
update tc set T=’C modif’ where T=’B modif’; |
«СЕКРЕТНО» не |
|
||
|
|
|
|
|
|
позволяет |
|
|
|
|
|
|
аналогично для удаления: |
пользователю C с RAL |
|
||
|
|
|
|
|
|
«ДСП» |
|
|
|
|
|
|
|
|
|
|
|
|
|
E-mail: market@relex.ru |
ЗАО НПП «РЕЛЭКС» |
http://www.relex.ru |
|
|||
|
|
|
|
|
|
|
|
|
Практическое занятие 7 |
|
Разграничение доступа в СУБД ЛИНТЕР. Мандатный доступ |
45 |
|
|
delete from tc where T='B modif'; |
перезаписать/удалить |
|
|
|
данные |
B |
TC |
понизить WAL поля T и RAL поля D в строке |
строка успешно |
|
|
до «ДСП»: |
обновлена |
|
|
update c.tc##”ДСП”# set T##”ДСП”#”ДСП” = |
|
|
|
T, D##”ДСП”#=D where T='B modif'; |
|
C |
TC |
удалить запись: |
теперь удаление |
|
|
|
успешно |
|
|
delete from tc where T='B modif'; |
|
7.10. Ограничение доступа с сетевых станций
Задача: Разрешить сетевой доступ для пользователей групп G1 и G2 только с конкретной сетевой станции; кроме того, уровень доступа этих пользователей должен быть не ниже «ДСП».
Указания:
1. Сначала отменим доступ любых пользователей с любых сетевых станций:
REVOKE ACCESS ON UNLISTED STATION FROM ALL;
3.Для данной практики необходима работа с двумя компьютерами: клиентом и сервером, имеющими разные сетевые адреса.
На клиентском компьютере настройте клиентскую часть (пропишите сервер в nodetab), запустите драйвер клиента. На серверной части запустите драйвер сервера.
Проконтролируйте настройки: на клиентской части запустите INL и попробуйте присоединится к серверу, например под пользователем SYSTEM. Должна выдаваться ошибка 1022 – нарушение привилегий (нет доступа с сетевых станций). Примечание. Если будут выдаваться другие ошибки, это означает, что неправильно настроено сетевое взаимодействие. Настройте его корректно.
4.Присоединитесь к БД с консоли сервера под АБ (SYSTEM), и создайте станцию в соответствии с условием задачи:
CREATE STATION G1_G2 PROTOCOL ‘TCPIP’ ADDRESS ‘<адрес станции>’ LEVEL(“ДСП”,”НЕСЕКРЕТНО”);
Адрес станции можно узнать, например, при помощи команды ifconfig в Unix, или через панель управления в Windows, или зная имя компьютера и подав ping на него.
5. Дайте доступ пользователям групп G1 и G2 к станции G1_G2:
GRANT ACCESS ON STATION G1_G2 TO G1;
GRANT ACCESS ON STATION G1_G2 TO G1;
6. Проверим возможность доступа пользователей с сетевой станции.
Пользователи A и C должны получить доступ. Пользователь B не получает доступ, т.к. его RAL выше максимального разрешенного RAL для станции G1_G2. Пользователи D и SYSTEM по-прежнему не имеют доступа с сетевых станций.
E-mail: market@relex.ru |
ЗАО НПП «РЕЛЭКС» |
http://www.relex.ru |
|
|
|
E-mail: market@relex.ru |
ЗАО НПП «РЕЛЭКС» |
http://www.relex.ru |
Практическое занятие 7 46 Разграничение доступа в СУБД ЛИНТЕР. Мандатный доступ
7.11. Ограничение доступа к внешним устройствам
Задача: Разрешить использовать дополнительную директорию ~/addb для хранения данных таблиц, если пользователи имеют уровень доступа (RAL) «СЕКРЕТНО» и выше. Пусть соответствующее устройство называется ‘SY01’.
Указания:
1.Вначале попробуем определить устройство через переменную окружения, как в незащищенном режиме. Выполним команды ОС:
mkdir ~/addb export SY01=~/addb
Попробуем создать таблицу, файл данных которой должен размещаться на устройстве SY01.
inl –u SYSTEM/MANAGER
SQL> create table t(I int) datafiles 1(‘SY01’ 10);
Получим ошибку нарушения мандатного доступа, т.к. указанное устройство не находится в списке разрешенных.
7. Создадим устройство:
CREATE DEVICE SY01 DIRECTORY ‘~/addb’ LEVEL(“СЕКРЕТНО”,”НЕСЕКРЕТНО”);
8. Дадим доступ к устройству всем пользователям:
GRANT ACCESS ON DEVICE SY01 TO ALL;
9. Проверим возможность работы с устройством.
Будем пытаться от имени разных пользователей (с категорией не ниже RESOURCE) размещать данные таблицы T на устройстве SY01 при помощи запроса
CREATE TABLE T(I INT) DATAFILES 1(‘SY01’ 10);
Результаты должны соответствовать таблице:
Пользователь |
Результат |
B |
успешно |
C |
неудачно: RAL пользователя недостаточен |
D |
успешно |
7.12. Аудит
Задача: Необходимо регистрировать все случаи успешной модификации данных таблицы C.TC любого вида (т.е. вставка, удаление, обновление), а также неуспешных попыток обновления данных в этой таблице. Необходимо также протоколировать все соединения и отсоединения пользователей к БД.
E-mail: market@relex.ru |
ЗАО НПП «РЕЛЭКС» |
http://www.relex.ru |
|
|
|
Практическое занятие 7 |
|
Разграничение доступа в СУБД ЛИНТЕР. Мандатный доступ |
47 |
Указания:
Работа выполняется под пользователем – АБ. Сначала необходимо включить протоколирование:
AUDIT START;
Затем необходимо настроить протоколирование требуемых событий:
AUDIT ENABLE INSERT ON C.TC BY ACCESS WHEN SUCCESS; AUDIT ENABLE DELETE ON C.TC BY ACCESS WHEN SUCCESS; AUDIT ENABLE UPDATE ON C.TC BY ACCESS WHEN SUCCESS; AUDIT ENABLE UPDATE ON C.TC BY ACCESS WHEN NOT SUCCESS; AUDIT ENABLE CONNECT WHEN SUCCESS;
AUDIT ENABLE DISCONNECT WHEN SUCCESS;
После этого выполните несколько успешных/неуспешных попыток модификации таблицы из-под разных пользователей (см. предыдущие задания) и просмотрите протокол:
SELECT * FROM AUDIT_EVENTS;
Задача для самостоятельного выполнения:
1. Необходимо также протоколировать удачные и неудачные попытки соединения
под пользователем SYSTEM, и |
удачные и неудачные попытки вставки строк в |
таблицу |
TB. |
E-mail: market@relex.ru |
ЗАО НПП «РЕЛЭКС» |
http://www.relex.ru |
|
|
|
48
Практическое занятие 8 Пример создания защищенной базы данных
Практика 2 часа (Лекция 6)
На лекции мы подробно рассмотрели пример проектирования защищенной БД для задачи автоматизации документооборота. На практическом занятии мы создадим эту БД, зададим в ней все ПРД, и проверим их функционирование на нескольких примерах запросов. В частности, мы проверим реакцию систему на выделенные нами в модели нарушителя попытки НСД.
Последовательности запросов для создания объектов БД и назначения ПРД содержатся в директории pract8. Каждый файл соответствует некоторому этапу проектирования защищенной БД. Мы будем исполнять эти файлы по порядку в утилите INL. Перед исполнением просмотрите и проанализируйте каждый файл.
Последовательность действий состоит из следующих этапов.
1. Подготовка базы данных
1.1.Создайте новую базу данных.
1.2.Запустите на ней СУБД ЛИНТЕР.
1.3.Проинициализируйте поддержку расширенного КСЗ и хранимых процедур/триггеров (для этого прогоните файлы systab.sql и secutiry.sql (для ЛИНТЕР 5.9 еще необходимо прогнать файл extsec.sql) из директории dict дистрибутива ЛИНТЕР). Для ЛИНТЕР 5.7 после этого необходимо остановить и снова перезапустить ядро, чтобы СУБД «увидела» соответствующие системные таблицы.
Замечание. После инициализации расширенной защиты в БД доступ к этой БД с удаленных сетевых станций будет по умолчанию запрещен. Чтобы разрешить доступ, надо либо явно прописать каждую станцию, либо явно подать запрос, разрешающий доступ со всех удаленных станций:
GRANT ACCESS ON UNLISTED STATION TO ALL;
2. Создание объектов базы данных и ПРД
2.1.Первый шаг в создании защищенной БД состоит в создании уровней защиты. Это задача администратора безопасности (АБ), т.е. пользователя SYSTEM. Прогоните файл cre_levels.sql.
2.2.Теперь АБ должен создать пользователя – администратора приложений (DOCUM) и группу «Документооборот». Соответствующие запросы приведены в файле init_doc.sql. Прогоните этот файл.
2.3.Следующим шагом разработчик создает объекты БД. Соединитесь с БД под пользователем DOCUM (можно сделать это не выходя из INL, подав команду
username DOCUM/ ). Прогоните файл doc_base.sql.
Обратите внимание, что в таблице содержимого документов мы явно подняли WAL до «ДСП», чтобы обеспечить, что содержимое документов будет всегда иметь гриф не ниже
«ДСП».
Кроме того, мы создали триггер INS_DOC_REG, которые обеспечивает, что ответственным за новый документ всегда оказывается начальник соответствующего отдела, а в поле создателя записывается логин того пользователя, который добавил запись. Также автоматически проставляются дата создания и статус документа.
2.4. Разработчик задает правила разграничения доступа: прогоните файл doc_base_access.sql.
3. Создание субъектов БД с соответствующими правами (в нашем примере
выполняет разработчик |
приложения, создавая новых |
пользователей СУБД) |
|
|
|
E-mail: market@relex.ru |
ЗАО НПП «РЕЛЭКС» |
http://www.relex.ru |
Практическое занятие 8 |
|
Пример создания защищенной базы данных |
49 |
3.1.Для удобства создания нового пользователя документооборота создайте хранимую процедуру reg_docum_user: прогоните файл reg_docum_user.sql. Эта процедура также использует процедуру генерации первичного ключа GeneratePK, так что прогоните также файл sp_seq.sql.
3.2.Создайте несколько пользователей системы документооборота. В файле test_cre_users.sql содержатся девять вызовов хранимой процедуры reg_docum_user,
которые создают три отдела и девять пользователей. Процедура должна возвращать значение 0 (нет ошибок). Можно проконтролировать список добавленных пользователей СУБД, подав select * from NEW_USERS.
4. Назначение групп и уровней доступа пользователям (выполняет АБ)
В нашем примере пользователи СУБД только что были созданы, поэтому АБ должен назначить им группы (в нашем случае «Документооборот») и уровни доступа. Войдите под АБ (можно не выходя из INL: username SYSTEM/MANAGER) и прогоните файл new_users_access.sql.
5. Инициализация подсистемы аудита (выполняет АБ)
Необходимо включить режим протоколирования и установить необходимость протоколирования изменений в таблицах БД документооборота. Соответствующие запросы приведены в файле doc_audit.sql.
8.1. Работа с защищенной базой данных
Попробуем сымитировать работу с нашей защищенной базой данных на примере жизненного цикла двух документов. Сначала мы разберемся, как будет выглядеть штатная работа с данными (без нарушений ПРД). Затем на примере уже имеющихся данных о документах проверим, что реализуются все требования ПРД по отношению к пресечению попыток НСД перечисленных в лекции типов.
Жизненный цикл будем имитировать через последовательности запросов, выдаваемых разными пользователями. Эти запросы можно исполнять через INL или утилиту lindesk (lindeskx), если она имеется в рассматриваемом дистрибутиве ЛИНТЕР.
Жизненный цикл первого документа:
1.Пользователь-секретарь SEC1 создает новый документ с идентификатором 1, именем ‘Документ 1’, и относит его к отделу с кодом 3 (в нашем примере это отдел с именем ‘Отдел 2’). Для этого соединяемся с сервером БД под именем SEC1 и подаем запрос
insert into doc_info_ins(doc_id, name, r_division) values(1, 'Документ 1', 3);
Результаты завершения свидетельствуют о том, что строка добавлена. Мы можем проверить это, подав select из doc_info_read:
select * from doc_info_read;
(в результате видим одну строку, причем триггер на INSERT автоматически прописал поля R_REVIEWER (‘BOSS2’), CRE_DATE и STATUS).
10.Начальник Отдела 2 назначает в качестве исполнителя документа своего подчиненного U21. Входим под именем BOSS2 и подаем запрос
update doc_info_write##"НЕСЕКРЕТНО"#"НЕСЕКРЕТНО"# set R_OPERATOR##"НЕСЕКРЕТНО"#"НЕСЕКРЕТНО"#='U21' where doc_id=1;
E-mail: market@relex.ru |
ЗАО НПП «РЕЛЭКС» |
http://www.relex.ru |
|
|
|
E-mail: market@relex.ru |
ЗАО НПП «РЕЛЭКС» |
http://www.relex.ru |
|
|
Практическое занятие 8 |
|
50 |
Пример создания защищенной базы данных |
|
|
|
Здесь нам пришлось явно указать несекретные метки доступа, т.к. если бы мы подали обычный UPDATE, запись о документе получила бы RAL “CЕКРЕТНО” по RAL-у пользователя BOSS2. Подобные ситуации необходимо учитывать при разработке приложений, чтобы пользователи с высоким уровнем доступа случайно не повышали уровень чтения модифицируемых ими данных там, где этого не должно быть.
Результат обновления можно проконтролировать при помощи запроса
select * from doc_info_read;
Заметим, что запись о документе доступна пользователю BOSS2, т.к. он является контролером документа.
11.Пользователь U21 добавляет содержимое документа, имеющее гриф «ДСП». Входим под именем U21. Подаем контрольный запрос
select * from doc_info_read;
Пользователь U21 видит запись, т.к. он назначен в качестве ответственного за документ.
Для добавления содержимого документа подаем запрос:
insert into doc_ins##"ДСП"#"ДСП" (r_doc##"ДСП"#"ДСП", comment##"ДСП"#"ДСП") values (1, 'Донесение');
В данном случае мы могли бы и не указывать метки доступа, т.к. у пользователя U21 RAL и WAL и так равны (“ДСП”,”ДСП”). Мы сделали это для полноты.
Теперь можно проконтролировать добавленную запись, подав запрос
select * from doc_read;
Ответственный за документ видит добавленную информацию (поле content типа
BLOB мы оставим в нашем примере пустым, т.к. оно не может заполняться запросами,
иэто уже задача приложения; на защиту это никак не влияет).
12.Начальник отдела BOSS2 проверяет добавленное содержимое документа.
Входим под именем BOSS2 и подаем запрос
select * from doc_read;
Начальник отдела также видит данные документа.
Жизненный цикл второго документа:
1.Пользователь-секретарь SEC2 создает новый документ с идентификатором 2, именем ‘Документ 2’, и относит его к отделу с кодом 2 (в нашем примере это отдел с именем ‘Отдел 1’). Для этого соединяемся с сервером БД под именем SEC2 и подаем запрос
insert into doc_info_ins(doc_id, name, r_division) values(2, 'Документ 2', 2);
Проверим:
E-mail: market@relex.ru |
ЗАО НПП «РЕЛЭКС» |
http://www.relex.ru |
|
|
|