Инструменты пользователя

Инструменты сайта


rdb_get_context

RDB$GET_CONTEXT

Версии сервера

0.9 1.0 1.5.3 1.5.4 1.5.5 2.0 2.0.3 2.0.4 2.1 2.5 3.0
- - - - - Да Да Да Да Да Да

Формат

RDB$GET_CONTEXT( «пространство имён», переменная)

Описание

Встроенная функция Дает доступ к информации о текущем подключении и текущей транзакции. Так же позволяет получать пользовательские переменые внутри транзакции или подключения заданые с помощью RDB$SET_CONTEXT.

:!: «Пространства имен» и переменые являются регистро зависимыми

:!: Для продотвращения DoS атак, существует ограничение на 1000 переменых в одном «пространстве имен».

RDB$GET_CONTEXT возращает текущее значение переменой, если переменой нет то возращается NULL.

в настоящий момент есть всего 3 «пространства имен» которые можно использовать:

USER_SESSION для пользовательских переменых, заданые через RDB$SET_CONTEXT в течении подключения.

USER_TRANSACTION для пользовательских переменых, заданые через RDB$SET_CONTEXT в течении транзакции.

SYSTEM предостовляют доступ к определеным переменым, описанных в следующей таблице

Переменая описаниевозможное значение
ENGINE_VERSION Возвращает текущую версию SQL-сервера Например, «2.5.0»
NETWORK_PROTOCOL Сетевой протокол, используемый клиентом. «TCPv4», «WNET», «XNET» , NULL
CLIENT_ADDRESS Сетевой адрес клиента для TCPv4 - «xxx.xxx.xxx.xxx», для XNET - ID процесса, для остальных NULL
DB_NAME Имя базы данных, в зависимости от подключения возвращает алиас или путь к файлу, указанные в строке подключения к базе данных.
ISOLATION_LEVEL Уровень изолированности текущей транзакции. «READ COMMITTED», «CONSISTENCY», «SNAPSHOT»
READ_ONLY Режим транзакции для чтения с 2.5.3 или 2.5.2 «TRUE», «FALSE»
TRANSACTION_ID Номер текущей транзакции, тоже самое что CURRENT_TRANSACTION
SESSION_ID Номер текущего подключения, тоже самое что CURRENT_CONNECTION
CURRENT_USER Текущий пользователь, тоже самое что CURRENT_USER
CURRENT_ROLE Текущая роль, тоже самое что CURRENT_ROLE

Пример

-- Получить текущую версию сервера
SELECT RDB$GET_CONTEXT('SYSTEM','ENGINE_VERSION') FROM RDB$DATABASE
 
-- Создание пользовательской переменной в рамках контекста
SELECT RDB$SET_CONTEXT('USER_SESSION','MY','Значение Моей Переменной') FROM RDB$DATABASE
-- Получить потом значение этой переменной
SELECT RDB$GET_CONTEXT('USER_SESSION','MY') FROM RDB$DATABASE
-- Но вот таким образом получить потом значение этой переменной нельзя,
-- т.к. пространство имен регистро-зависимое
SELECT RDB$GET_CONTEXT('USER_SESSION','My') FROM RDB$DATABASE

С помощью контекстных переменных можно сделать нумерацию строк в запросе

SELECT RDB$GET_CONTEXT('USER_TRANSACTION','ROW') AS ROWNUM,
       E.*,
       RDB$SET_CONTEXT('USER_TRANSACTION','ROW', CAST(COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION','ROW'),0) AS INTEGER)+1) AS X
FROM   EMPLOYEE E

Чтобы перезапуск вышеприведенного запроса (без commit'a или rollback'a) не приводил к увеличению счетчика строк, можно «проинициализировать» CONTEXT-переменную холостой выборкой из rdb$database с null-значениями всех полей. Эта «null-строка» далее отсеивается where-предикатом. Чтобы не отображался столбец 'X', нельзя удалять его из select-списка. Вместо этого надо включить его в выражение вычисления другого числового столбца, но так, чтобы это не повлияло на итоговый результат. Например, можно умножить 'X' на ноль и добавить к rownum - на результат это не повлияет:

SELECT rownum+0*x rownum, emp_no, emp_name
FROM(
  SELECT 
    rdb$set_context('USER_TRANSACTION','row',0) rownum,
    NULL emp_no,
    NULL emp_name,
    NULL x
  FROM rdb$database
 
  UNION ALL
 
  SELECT 
    1+CAST(rdb$get_context('USER_TRANSACTION','row') AS INT) AS rownum,
    e.emp_no,
    e.last_name emp_name,
  rdb$set_context('USER_TRANSACTION','row', CAST(COALESCE(rdb$get_context('USER_TRANSACTION','row'),0) AS INTEGER)+1) AS x
  FROM   
  employee e
)t
WHERE emp_no IS NOT NULL
;

См. также

Источник

%Firebird%\doc\sql.extensions\README.context_variables2.txt

Обсуждение

Виктор, 2008/07/25 12:30

что такое RDB подключение, и как его сделать?

Attid, 2008/07/25 13:52

вопрос не понял, на странице не слова про «подключение» нету, а RDB подключение вообще в природе не существует

Sasha, 2009/09/23 13:08

Здравствуйте,

Могли бы Вы помочь в одном вопросе ? Существует задача по блокировке объекта - документа в базе пользователем (другие могут просматривать но не редактировать), реализация предусматривает таблицу LockedObjects в которой документы блокируются по SESSION_ID. однако при не корректном окончании сессии, до разблокировки документа, имеет место безконечная блокировка…

Подскажите пожалуйсто, каким образом можно узнать наличие подключения имея значение SESSION_ID.

спасибо…

Attid, 2009/09/23 13:37

лучше спрашивать на форуме, рекомендую sql.ru

начиная с 2,1 можно посмотреть в таблицы мониторинга, но это может делать только сисдба лучшим вариантом будет использование тригеров на дисконект

Sasha, 2009/09/23 18:22

большое спасибо, триггер на on disconnect помог…

Ваш комментарий. Вики-синтаксис разрешён:
Y K B J U
 
rdb_get_context.txt · Последнее изменение: 2017/06/29 09:46 — 95.129.237.194