Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции СУБД.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
6.32 Mб
Скачать

Привилегии и безопастность

Для модуля DBMS_PIPE установлены три различных уровня безопасности. Первым уровнем является привилегия EXECUTE на сам модуль. По умолчанию при создании модуля эта привилегия не предоставляется всем пользователям. Поэтому обращаться к модулю DBMS_PIPE смогут только те пользователи, которые имеют системную привилегию EXECUTE ANY PROCEDURE. Для того чтобы разрешить доступ к модулю DBMS_PIPE другим пользователям базы данных, нужно воспользоваться оператором GRANT и предоставить им привилегии EXECUTE на этот модуль.

Для обеспечения первого уровня безопасности информации привилегию EXECUTE на DBMS_PIPE можно предоставить только определенным пользователям базы данных. После этого можно создать свой собственный модуль для управления доступом к базовым каналам. Затем привилегию EXECUTE на этот модуль можно предоставить и другим пользователям. Второй уровень безопасности – имя программного канала. Если пользователи не знают этого имени, они не смогут посылать и принимать сообщения по данному каналу. Имя программного канала можно выбрать случайным образом или создать имя, уникальное для двух сеансов, взаимодействующих при помощи канала. Последний способ реализуется с помощью функции UNIQUE_SESSION_NAME и описан ниже.

Самым надежным уровнем безопасности является использование частных каналов. Частный канал доступен только пользователю, создавшему его, и пользователям, присоединившимся как SYSDBA или INTERNAL, поэтому доступ к каналу существенно ограничен. Даже если какой-либо пользователь имеет привилегию EXECUTE на модуль DBMS_PIPE и знает имя программного канала, при попытке доступа он получит сообщение об ошибке ORACLE: “ОRА-23322: insufficient privilege to access pipe” (привилегии, недостаточные для доступа к каналу). Данная ошибка возникает только при создании или удалении канала либо при попытке послать или получить сообщение. Другие вызовы в DBMS_PIPE не обращаются непосредственно к программным каналам.

Лучшим способом использования частных каналов является создание хранимых процедур или модулей, которые, в свою очередь, вызывают модуль DBMS_PIPE. Поскольку хранимые подпрограммы выполняются на основании набора привилегий своего владельца, к частным каналам можно обращаться и из хранимых подпрограмм.

Установление протокола связи

Программные каналы используются так же, как и другие низкоуровневые пакеты связи, например TCP/IP. Пользователь имеет возможность самостоятельно определить способы форматирования данных и их пересылки. Кроме того, пользователь может решить, кто должен получить сообщение. Поэтому сеансы отправители дабы воспользоваться гибкостью межсеансовых каналов должны следовать определенным рекомендациям по организации обмена информацией с сеансами-получателями. Прежде всего, между сеансами должны быть строго согласованы правила форматирования сообщений.

Форматирование сообщений

Каждое сообщение, посылаемое по программному каналу, состоит из одного или нескольких элементов данных. Элементы данных заносятся в буфер сообщений с помощью процедуры РАСК_MESSAGE, и после этого все содержимое буфера посылается по каналу с помощью функции SEND_MESSAGE. На другой стороне канала буфер принимается функцией RECEIVE_MESSAGE, а элементы данных считываются с помощью функции NEXT_ITEM_TYPE и процедуры UNPACK_MESSAGE.

Операции, выполняемые принимающей программой, обычно зависят от содержимого получаемого сообщения. Так триггер из следующего примера использует первый пункт данных для форматирования сообщения. По существу, первый элемент данных является кодом операции (opcode), или инструкцией, которая сообщает принимающей программе о том, как следует интерпретировать остальные данные.

create or replace trigger LogRSInserts

bеfore insert on registered_staff

for еасн row

declare

v_Status integer;

begin

/* Сначала упакуем в буфере описание операции. */

DBMS_PIPE.РАСК_MESSAGE (‘I’);

/* Упакуем информацию о текущем пользователе и временную метку.*/

DBMS_PIPE.PACK_MESSAGE (USER);

DBMS_PIPE.РАСК_MESSAGE (SYSDATE);

/* Упакуем новые значения.*/

DBMS_PIPE.PACK_MESSAGE (:new.fname);

DBMS_PIPE.PACK_MESSAGE (:new.lname);

DBMS_PIPE.PACK_MESSAGE (:new.tel_no);

DBMS_PIPE.PACK_MESSAGE (:new.address);

/* Пошлем сообщение по каналу ‘RSInserts’ */

v_Status := DBMS_PIPE.SEND_MESSAGE (‘RSInserts’);

/*Если посылка неудачна, установим ошибку так, чтобы изменение не

было внесено*/

if v_Status != 0 then

raise_application_error (-20010, ‘LogRSInserts trigger’ ||

‘couldn’t send the message, status =’ || v_Status);

end if;

end LogRSInserts;

В зависимости от вида информации, в сообщении могут содержаться данные различных типов или разное количество элементов данных. Рекомендуется также помимо других инструкций включать в сообщение инструкцию STOP. Ее можно использовать, к примеру, для сообщения ожидающей программе о том, что нужно отсоединиться от базы данных и корректно завершить работу. Без такого сообщения ожидающая программа будет уничтожена операционной системой и/или базой данных, что нежелательно.