Контекст сеансу в Oracle. Частина 1: зумовлені контексти

Анотація


У кожному сеансі роботи з СУБД можна використовувати так звані контексти, формально представляють собою іменований набір пар "параметр / значення". Контексти сеансів володіють рядом цікавих властивостей, істотно підвищують "внутрішні" можливості Oracle по створенню додатків. У статті розглядаються два зумовлені контексту Oracle: USERENV і CLIENTCONTEXT.

Введення


У кожному сеансі роботи з СУБД можна використовувати так звані контексти. Кожен контекст – це іменований набір пар "параметр / значення". Oracle називає кожен конкретний подібний набір простором імен (Namespace), а елементи простору імен атрибутами, Що можуть приймати значення.

Створюються контексти SQL-пропозицією CREATE CONTEXT. Через це далі замість "простору імен" перевага віддається терміну "контекст". Параметри контексту ("атрибути") встановлюються процедурою DBMS_SESSION.SET_CONTEXT, а ось вичитуються в програму стандартною функцією SYS_CONTEXT. Пакет DBMS_SESSION містить ряд інших підпрограм для роботи з контекстами.

Тут розглядається лише формальна сторона контексту сеансу, а спосіб його застосування розробник може визначити сам або почерпнути з описів виборчого доступу до даних (FGAC або Label Security) та сервера додатків Oracle.

Готовий довідковий контекст сеансу USERENV


Один контекст, з назвою USERENV, створювати явним чином не потрібно. Він доступний кожному сеансу зв'язку з СУБД Oracle у вигляді готового набору значень, що дозволяє тільки прочитання, але не правку. Він дозволяє дізнатися всілякі відомості про сеанс, корисні для прикладного програмування. Раніше в Oracle існувала однойменна функція, але зараз вона підтримується заради старих програм.

Приклад інформації, яку можна отримати з контексту USERENV в програму:

COLUMN authent FORMAT A10
COLUMN curr_schema FORMAT A10
COLUMN curr_user FORMAT A10
COLUMN db_name FORMAT A10
COLUMN db_domain FORMAT A10
COLUMN host FORMAT A15
COLUMN ip_address FORMAT A15
COLUMN os_user FORMAT A15

SELECT
SYS_CONTEXT ( “userenv”, “AUTHENTICATION_TYPE” ) authent
, SYS_CONTEXT ( “userenv”, “CURRENT_SCHEMA” ) curr_schema
, SYS_CONTEXT ( “userenv”, “CURRENT_USER” ) curr_user
, SYS_CONTEXT ( “userenv”, “DB_NAME” ) db_name
, SYS_CONTEXT ( “userenv”, “DB_DOMAIN” ) db_domain
, SYS_CONTEXT ( “userenv”, “HOST” ) host
, SYS_CONTEXT ( “userenv”, “IP_ADDRESS” ) ip_address
, SYS_CONTEXT ( “userenv”, “OS_USER” ) os_user
FROM dual
;


Повний список атрибутів контексту USERENV можна дізнатися з документації (у довіднику з SQL, в розділі, присвяченому функції SYS_CONTEXT).

Ось, приклад, як відомості з цього контексту допомагають розрізнити різні умови вживання конкретної програми:

CONNECT scott/tiger

CREATE PROCEDURE whoowns
AS
BEGIN
DBMS_OUTPUT.PUT_LINE (SYS_CONTEXT ("userenv", "CURRENT_SCHEMA"));
DBMS_OUTPUT.PUT_LINE (SYS_CONTEXT ("userenv", "CURRENT_USER"));
DBMS_OUTPUT.PUT_LINE ( user );
END;
/


Перевірка:

SQL> SET SERVEROUTPUT ON
SQL> EXECUTE whoowns
SCOTT
SCOTT
SCOTT

PL/SQL procedure successfully completed.

SQL> ALTER SESSION SET CURRENT_SCHEMA = system;

Session altered.

SQL> EXECUTE scott.whoowns
SCOTT
SCOTT
SCOTT

PL/SQL procedure successfully completed.

SQL> CONNECT / as sysdba
Connected.
SQL> SET SERVEROUTPUT ON
SQL> EXECUTE scott.whoowns
SCOTT
SCOTT
SYS

PL/SQL procedure successfully completed.


Перетрансліруем процедуру для роботи з правами запускаючої:

CONNECT scott/tiger

CREATE OR REPLACE PROCEDURE whoowns
AUTHID CURRENT_USER
AS
BEGIN
DBMS_OUTPUT.PUT_LINE (SYS_CONTEXT ("userenv", "CURRENT_SCHEMA"));
DBMS_OUTPUT.PUT_LINE (SYS_CONTEXT ("userenv", "CURRENT_USER"));
DBMS_OUTPUT.PUT_LINE ( user );
END;
/


Знову перевірка:

SQL> SET SERVEROUTPUT ON
SQL> EXECUTE whoowns
SCOTT
SCOTT
SCOTT

PL/SQL procedure successfully completed.

SQL> ALTER SESSION SET CURRENT_SCHEMA = system;

Session altered.

SQL> EXECUTE scott.whoowns
SYSTEM
SCOTT
SCOTT

PL/SQL procedure successfully completed.

SQL> CONNECT / as sysdba
Connected.
SQL> SET SERVEROUTPUT ON
SQL> EXECUTE scott.whoowns
SYS
SYS
SYS

PL/SQL procedure successfully completed.

SQL> ALTER SESSION SET CURRENT_SCHEMA = system;

Session altered.

SQL> EXECUTE scott.whoowns
SYSTEM
SYS
SYS


Приклади пояснюють відміну атрибутів CURRENT_SCHEMA і CURRENT_USER контексту USERENV один від одного і від системної змінної USER.

Готовий змінюваний контекст сеансу CLIENTCONTEXT


Ще один зумовлений контекст, з ім'ям CLIENTCONTEXT, також не вимагає спеціального створення, проте на відміну від USERENV він дозволяє сеансу створювати власні атрибути і задавати їм значення. Особливість цього контексту в тому, що він, на додаток до звичайного способу (зсередини сеансу), дозволяє встановлювати значення атрибутів заздалегідь, при відкритті з'єднання з СУБД клієнтською програмою, і передавати їх для обробки в сеанс. Робиться це


Значення переданих у сеанс атрибутів контексту CLIENTCONTEXT можна читати як зазвичай функцією SYS_CONTEXT, і змінювати, але можна заводити й нові атрибути:

SQL> CONNECT scott/tiger
Connected.
SQL> EXECUTE DBMS_SESSION.SET_CONTEXT ( “CLIENTCONTEXT”, “a”, “b” )

PL/SQL procedure successfully completed.

SQL> SELECT SYS_CONTEXT (“CLIENTCONTEXT”, “a” ) FROM dual;

SYS_CONTEXT(“CLIENTCONTEXT”,”A”)
————————————————– ——————
b


Якби атрибут A був встановлений клієнтською програмою на C або на Java перед встановленням з'єднання, значення B ми б побачили відразу.

Друге відмітна властивість контексту CLIENTCONTEXT в тому, що Oracle дозволяє саме для нього звертатися до DBMS_SESSION.SET_CONTEXT напряму (див. вище). Цей виняток: контексти, які розробник побажає створювати сам, дозволять звертатися до DBMS_SESSION.SET_CONTEXT тільки з тексту своєї довірчої програмної одиниці.

наступна стаття серії


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*