Контекст сеанса

добавлено: 18 фев 19
понравилось:0
просмотров: 2603
комментов: 0

теги:

Автор: Myp3_u_K

Чалышев Максим Михайлович
SQL. 5 дней которые изменят твою жизнь.

Введение
В каждой сессии есть возможность использовать специальные структуры данных, именуемые контекст.
Контексты - это набор данных вида - параметр значение. Контекст предоставляет дополнительные возможности для приложений, использующих СУБД Oracle.
Теория и практика
Контекст - это предопределённый набор параметров и значений создаваемый в рамках определенной сессии. Несколько таких наборов параметр значение, объединяется с помощью структуры называемой контекстом.

Задается значение контекста с помощью процедуры DBMS_SESSION.SET_CONTEXT

Функция SYS_CONTEXT позволяет получить значение заданного контекста в раках сессии.
Для создания контекста специальная команда CREATE CONTEXT.
Сначала следует создать специальною процедуру для управления контекстом.

CREATE OR REPLACE PROCEDURE set_mycontext_value ( par IN VARCHAR2, val IN VARCHAR2 ) 
AS BEGIN  DBMS_SESSION.SET_CONTEXT ( 'myctx', par, val ); END;

CREATE OR REPLACE CONTEXT myctx USING set_mycontext_value;


BEGIN 
 set_mycontext_value ('paramuser', 'abc'); 
END;

SELECT SYS_CONTEXT ('myctx', 'paramuser' ) FROM dual;


Существует специальный системный контекст CLIENTCONTEXT
CLIENTCONTEXT при открытии сеанса задает информацию, дополнительную к заданным сведениям ((текущая схема, пользователь, тип авторизации, домен, хост, наименование DB, имя пользователя информационной системы…), контекста USERENV.
Пример

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;

Результат для моего компьютера

Данная информация достаточно часто используется при разработке Oracle приложений
Существует еще один специальный контекст - CLIENTCONTEXT, клиентский контекст
Данный контекст не требует специального создания, и позволяет сессии пользователя, создавать собственные атрибуты и значения. Этот контекст позволяет устанавливать значения заранее, при открытии соединения с СУБД приложением.
CLIENTCONTEXT можно считывать функцией SYS_CONTEXT, а так же изменять, и создавать новые атрибуты:
Пример

begin
  DBMS_SESSION.SET_CONTEXT ( 'CLIENTCONTEXT', 'paramuser', 'valuser' );
end;

SELECT SYS_CONTEXT ('CLIENTCONTEXT', 'paramuser' ) FROM dual;

--  valuer
begin
  DBMS_SESSION.SET_CONTEXT ( 'CLIENTCONTEXT', 'paramuser', 'valuser1' );
end;

SELECT SYS_CONTEXT ('CLIENTCONTEXT', 'paramuser' ) FROM dual;
-- valuser1

Важные замечания
В DBMS_SESSION содержит ряд других подпрограмм для работы с контекстами.
Для создания контекста необходимы права CREATE ANY CONTEXT, они могут быть выданы администратором системы.
Вопросы учеников
Можно ли в контекст использовать для других типа данных, а не только для строк?
Да, вот пример использования числа

begin
  DBMS_SESSION.SET_CONTEXT( 'CLIENTCONTEXT', 'paramuser', 343435 );
end;

SELECT SYS_CONTEXT ('CLIENTCONTEXT', 'paramuser' ) FROM dual;

Какие еще данные можно извлечь из системного контекста?
Вот список информации, которую можно получить из системного контекста

ACTION Возвращает позицию в модуле
AUDITED_CURSORID Возвращает идентификатор курсора SQL, который вызвал аудит
AUTHENTICATED_IDENTITY Возвращает идентификатор, использованный при аутентификации
AUTHENTICATION_DATA Данные аутентификации
AUTHENTICATION_METHOD Возвращает метод аутентификации
AUTHENTICATION_TYPE Описывает, как пользователь прошел проверку подлинности. Может принимать одно из следующих значений: База данных, ОС, Сеть или Прокси
BG_JOB_ID Если сеанс был установлен фоновым процессом Oracle, этот параметр вернет идентификатор задания. В противном случае он вернет NULL.
CLIENT_IDENTIFIER Возвращает идентификатор клиента (глобальный контекст)
CLIENT_INFO Информация о сеансе пользователя
CURRENT_BIND Связать переменные для детального аудита
CURRENT_SCHEMA Возвращает схему по умолчанию, используемую в текущей схеме
CURRENT_SCHEMAID Возвращает идентификатор схемы по умолчанию, используемой в текущей схеме
CURRENT_SQL Возвращает SQL, который вызвал событие аудита
CURRENT_SQL_LENGTH Возвращает длину текущего оператора SQL, который вызвал событие аудита
CURRENT_USER Имя текущего пользователя
CURRENT_USERID ИД пользователя текущего пользователя
DB_DOMAIN Домен базы данных из параметра инициализации DB_DOMAIN
DB_NAME Имя базы данных из параметра инициализации DB_NAME
DB_UNIQUE_NAME Имя базы данных из параметра инициализации DB_UNIQUE_NAME
ENTRYID Доступный идентификатор записи аудита
ENTERPRISE_IDENTITY Возвращает личность пользователя в масштабе предприятия
EXTERNAL_NAME Внешний пользователь базы данных
FG_JOB_ID Если сеанс был установлен клиентским процессом переднего плана, этот параметр вернет идентификатор задания. В противном случае он вернет NULL.
GLOBAL_CONTEXT_MEMORY Номер, используемый в глобальной области системы контекстом глобального доступа
GLOBAL_UID Глобальный идентификатор пользователя из Oracle Internet Directory для входа в систему безопасности предприятия. Возвращает NULL для всех остальных имен входа.
HOST Имя хост-машины, с которой клиент подключился
IDENTIFICATION_TYPE Возвращает способ создания схемы пользователя
INSTANCE Идентификационный номер текущего экземпляра
INSTANCE_NAME Имя текущего экземпляра
IP_ADDRESS IP-адрес компьютера, с которого клиент подключился
ISDBA Возвращает TRUE, если у пользователя есть привилегии DBA. В противном случае он вернет FALSE.
LANG Сокращение ISO для языка
ЯЗЫК Язык, территория и характер сеанса. В следующем формате: language_territory.characterset
MODULE Возвращает имя приложения, установленное через пакет DBMS_APPLICATION_INFO или OCI
NETWORK_PROTOCOL Используется сетевой протокол
NLS_CALENDAR Календарь текущей сессии
NLS_CURRENCY Валюта текущего сеанса
NLS_DATE_FORMAT Формат даты для текущего сеанса
NLS_DATE_LANGUAGE Язык, используемый для дат
NLS_SORT BINARY или основа лингвистической сортировки
NLS_TERRITORY Территория текущего
OS_USER Имя пользователя ОС для пользователя, вошедшего в систему
POLICY_INVOKER Призыватель функций политики безопасности на уровне строк
PROXY_ENTERPRISE_IDENTITY DN интернет-каталога Oracle, если прокси-пользователь является корпоративным пользователем
PROXY_GLOBAL_UID Глобальный идентификатор пользователя из Oracle Internet Directory для корпоративных пользователей-посредников. Возвращает NULL для всех других прокси-пользователей.
PROXY_USER Имя пользователя, открывшего текущий сеанс от имени SESSION_USER
PROXY_USERID Идентификатор пользователя, открывшего текущий сеанс от имени SESSION_USER
SERVER_HOST Имя хоста компьютера, на котором работает экземпляр
SERVICE_NAME Имя службы, к которой подключен сеанс
SESSION_USER Имя пользователя базы данных пользователя, вошедшего в систему
SESSION_USERID Идентификатор базы данных пользователя, вошедшего в систему
SESSIONID Идентификатор сеанса
SID Номер сеанса
STATEMENTID Идентификатор аудиторского заключения
TERMINAL Идентификатор ОС текущего сеанса


Пример

SELECT SYS_CONTEXT('USERENV', 'LANG') AS RESULT FROM DUAL;
--RESULT RU
 
SELECT SYS_CONTEXT('USERENV', 'LANGUAGE') AS RESULT FROM DUAL;
--RESULT RUSSIAN_CIS.CL8MSWIN1251
 
SELECT SYS_CONTEXT('USERENV', 'NLS_CALENDAR') AS RESULT FROM DUAL;
--RESULT GREGORIAN
 
SELECT SYS_CONTEXT('USERENV', 'NLS_DATE_FORMAT') AS RESULT FROM DUAL;
--RESULT DD.MM.RR
 
SELECT SYS_CONTEXT('USERENV', 'NLS_TERRITORY') AS RESULT FROM DUAL;
--RESULT CIS

Комментарии




Необходимо войти на сайт, чтобы оставлять комментарии