добавлено: 18 фев 19
понравилось:0
просмотров: 12618
комментов: 1
теги:
понравилось:0
просмотров: 12618
комментов: 1
теги:
Автор: Myp3_u_K
Чалышев Максим Михайлович
SQL. 5 дней которые изменят твою жизнь.
Введение
В каждой сессии есть возможность использовать специальные структуры данных, именуемые контекст.
Контексты - это набор данных вида - параметр значение. Контекст предоставляет дополнительные возможности для приложений, использующих СУБД Oracle.
Теория и практика
Контекст - это предопределённый набор параметров и значений создаваемый в рамках определенной сессии. Несколько таких наборов параметр значение, объединяется с помощью структуры называемой контекстом.
Задается значение контекста с помощью процедуры DBMS_SESSION.SET_CONTEXT
Функция SYS_CONTEXT позволяет получить значение заданного контекста в раках сессии.
Для создания контекста специальная команда CREATE CONTEXT.
Сначала следует создать специальною процедуру для управления контекстом.
Существует специальный системный контекст CLIENTCONTEXT
CLIENTCONTEXT при открытии сеанса задает информацию, дополнительную к заданным сведениям ((текущая схема, пользователь, тип авторизации, домен, хост, наименование DB, имя пользователя информационной системы…), контекста USERENV.
Пример
Результат для моего компьютера
Данная информация достаточно часто используется при разработке Oracle приложений
Существует еще один специальный контекст - CLIENTCONTEXT, клиентский контекст
Данный контекст не требует специального создания, и позволяет сессии пользователя, создавать собственные атрибуты и значения. Этот контекст позволяет устанавливать значения заранее, при открытии соединения с СУБД приложением.
CLIENTCONTEXT можно считывать функцией SYS_CONTEXT, а так же изменять, и создавать новые атрибуты:
Пример
Важные замечания
В DBMS_SESSION содержит ряд других подпрограмм для работы с контекстами.
Для создания контекста необходимы права CREATE ANY CONTEXT, они могут быть выданы администратором системы.
Вопросы учеников
Можно ли в контекст использовать для других типа данных, а не только для строк?
Да, вот пример использования числа
Какие еще данные можно извлечь из системного контекста?
Вот список информации, которую можно получить из системного контекста
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 Идентификатор ОС текущего сеанса
Пример
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
Комментарии
Вот в этом абзаце не про CLIENTCONTEXT, а про USERENV:
"Существует специальный системный контекст CLIENTCONTEXT
CLIENTCONTEXT при открытии сеанса задает информацию, дополнительную к заданным сведениям ((текущая схема, пользователь, тип авторизации, домен, хост, наименование DB, имя пользователя информационной системы…), контекста USERENV."
А ещё стОит упомянуть, что хотя имя контекста подчиняется правилам именования объектов (т.е. может быть регистро-зависимое) и можно создать контекст с именем "ConTexT", но DBMS_SESSION.SET_CONTEXT такое имя не примет (по крайней мере в версии 19.3), даже если прямо в кавычках передавать.
И это похоже на баг.