Контекст сеансу в 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>

*

*