powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / RDB$GET_CONTEXT() к другому пользователю ?
25 сообщений из 32, страница 1 из 2
RDB$GET_CONTEXT() к другому пользователю ?
    #39214732
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где хранятся контекстные переменные?

Можно ли в принципе к ним сделать доступ как к таблицам мониторинга: если текущее соединение от админа БД, то он могу бы читать переменные от любого соединения, не только своего.

Т.е. ввести вариант функции

Код: plaintext
RDB$GET_CONTEXT ('<namespace>', '<varname>', attachment_id integer)
кoторая у всех кроме админа будет работать только с attachment_id == current connection?

Можно, конечно, сделать табличку и чистить ее триггерами ON DISCONNECT
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39214737
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

MON$CONTEXT_VARIABLES
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39214739
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

тьфу, протупил, спасибо
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39214746
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, что у этих функций и таблички чарсет NONE, хотя и создана БД и подключение к ней Win1215...

Всё же таки со строками работаем...
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39214747
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WIN1251 конечно же

Код: plaintext
select rdb$character_set_name from rdb$database
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39214779
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochСтранно, что у этих функций и таблички чарсет NONE, хотя и создана БД и подключение к ней Win1215...А еще странно, что ФБ позволяет (якобы) завести переменную с unicode-именем длинной 80 символов, но на самом деле это не так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
$ /opt/fb30ss/bin/isql e30 -ch utf8
Database: e30, User: SYSDBA
SQL> set list on;

SQL> select rdb$set_context('USER_SESSION','абвгдеёжзийклмнорпстуфхцчшщъыьэюятралял', 'length=39 characters') from rdb$database;

RDB$SET_CONTEXT                 0


SQL> commit; select * from mon$context_variables;

MON$ATTACHMENT_ID               29
MON$TRANSACTION_ID              <null>
MON$VARIABLE_NAME               абвгдеёжзийклмнорпстуфхцчшщъыьэюятралял
MON$VARIABLE_VALUE              length=39 characters


SQL> select rdb$set_context('USER_SESSION','абвгдеёжзийклмнорпстуфхцчшщъыьэюятраляля', 'length=40 characters') from rdb$database;

RDB$SET_CONTEXT                 0


SQL> commit; select * from mon$context_variables;                                                                                
MON$ATTACHMENT_ID               29
MON$TRANSACTION_ID              <null>
MON$VARIABLE_NAME               абвгдеёжзийклмнорпстуфхцчшщъыьэюятралял
MON$VARIABLE_VALUE              length=39 characters

MON$ATTACHMENT_ID               29
MON$TRANSACTION_ID              <null>
MON$VARIABLE_NAME               абвгдеёжзийклмнорпстуфхцчшщъыьэюятраляля
MON$VARIABLE_VALUE              length=40 characters


SQL> select rdb$set_context('USER_SESSION',' абвгдеёжзийклмнорпстуфхцчшщъыьэюятраляляля ', 'length=42 characters') from rdb$database;

 RDB$SET_CONTEXT                 0 


SQL> commit; select * from mon$context_variables;                                                                                
Statement failed, SQLSTATE = 22001
arithmetic exception, numeric overflow, or string truncation
-string right truncation
-expected length 80, actual 84
SQL>

Если строка ' абвгдеёжзийклмнорпстуфхцчшщъыьэюятраляляля ' не может быть запихана в mon$context_var, то зачем возвращать ноль ?

PS. LI-V3.0.0.32474
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39214886
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

а rdb$Get_context её обрaтно считает ?
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39214892
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

Попробуй, пожалуйста, в два соединения

$ /opt/fb30ss/bin/isql e30 -ch utf8

и с другой кодировкой, КОИ8-Р или например

$ /opt/fb30ss/bin/isql e30 -ch WIN1251

потом в одном соединении создаешь переменную с кирриллическим именем или значением, а в другом - пытаешься считать через таблицу и через rdb$GET_context

скорее всего, тоже будут непонятки

PS. С одной стороны, эти контекстные переменные, вероятно, атавизм до-мониторных времён 2.0...
С другой стороны, при отсутсвии стандартной их заменяющей таблицы самоочищающейся на триггерах - удобно всё-таки. Хотя и придетс все строчки если что в MIME-encapsulation кодировать
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39214898
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

ты эта давай таблицы мониторинга с контекстными переменными не мешай. Это разные вещи, и предназначены они для разных целей. Пересечения могут быть только в пространстве SYSTEM.

Про самоочищающиеся таблицы не понял. Нафига? Чем GTT не устраивают?
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39214922
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисты эта давай таблицы мониторинга с контекстными переменными не мешай.

Это ты не мне, это ты Владу внушай - 19052260


Симонов ДенисЧем GTT не устраивают?

тем что вопрос изначально

Ariochчитать переменные от любого соединения, не только своего.
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39214937
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

я тебе ещё раз говорю. Таблицы мониторинга не предназначены для чтения контекстных переменных. От слова совсем. То что в них можно посмотреть текущие значения, так это скорее для целей отладки. Да и сами таблицы мониторинга только для администрирования. При попытке использовать их как нибудь ещё можно больно получить шваброй.
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39214943
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Отлчино! Ну раз у тебя есть советы лучше, чем у Влада, то ответь, пожалуйста, на вопрос из ПЕРВОГО поста: подскажи, как мне из соединения №1 прочитать переменную, установленную соединением №2.

Решение Влада плохое и неправильное. Я понял. Подскажи правильное и хорошее.

Спасибо.
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39214949
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денистолько для администрирования.

и таки да, этот вопрос возник именно в целях "посмотреть админу, кто сейчас пасется в БД", причем "кто" в несколько более широком смысле чем "Вася из 112-й комнаты"
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39214958
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

ответь на главный вопрос. Зачем?

Влад только сказал, что значения контекстных переменных всех сессий можно найти в таблице мониторинга MON$CONTEXT_VARIABLES.
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39214960
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochи таки да, этот вопрос возник именно в целях "посмотреть админу, кто сейчас пасется в БД", причем "кто" в несколько более широком смысле чем "Вася из 112-й комнаты"

А ну в таком понимании ещё ладно. Хотя контекстные переменные для этого не очень подходят. Ибо их количество ограничено
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39214980
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochМожно, конечно, сделать табличку и чистить ее триггерами ON DISCONNECT

для того что ты хочешь можно и не чистить. Заодно история коннектов будет
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39215018
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисдля того что ты хочешь можно и не чистить

ну тогда там будут оставаться призраки - соединения, которые аварийно отвалились.

Симонов ДенисЗаодно история коннектов будет

Вообще-то она там и так есть - просто неудобно отлавливать в большом общем логе конкретные события.

А для отдельной спец-таблички, чтобы её не чистить, нужно придумать как отличать актуальные соединения от прошлых. И тут два варианта - либо таки триггер ON DISCONNECT, либо сверять табличку с MON$ATTACHENTS. Но последнее - ничуть не хуже чем просто обращение к MON$CONTEXT_VARIABLES.


Симонов ДенисИбо их количество ограничено

Количество - или суммарная длинна? В принципе, ожидаемо.
Но в c:\Program Files\Firebird\Firebird_2_5\doc\sql.extensions\README.context_variables2.txt поиск по "limit' и "restrict" ничего не находит.
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39215020
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисИбо их количество ограничено

И с другой стороны, это ограничение - на соединение, или на процес сервера ?
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39215044
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

Код: sql
1.
2.
3.
4.
5.
6.
SELECT
    *
FROM
    MON$ATTACHMENTS A
    JOIN MYTABLE T ON A.MON$ATTACHMENT_ID = T.ATTACHMENT_ID
          AND A.MON$TIMESTAMP = T.TIMESTART  



и все активные соединения со специфическими атрибутами как на ладони.
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39215057
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch$ /opt/fb30ss/bin/isql e30 -ch utf8 и с другой кодировкой, КОИ8-Р или например $ /opt/fb30ss/bin/isql e30 -ch WIN1251 потом в одном соединении создаешь переменную с кирриллическим именем или значением, а в другом - пытаешься считать через таблицу и через rdb$GET_context

скорее всего, тоже будут непонятки см аттач (для линуха пробовал с -ch utf8 и -ch koi8r -- результат одинаковый).
Сообщений типа 'can not transliterate блаблабла' не видно.
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39215068
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисВлад только сказал, что значения контекстных переменных всех сессий можно найти в таблице мониторинга MON$CONTEXT_VARIABLES.Именно так
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39215183
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochА для отдельной спец-таблички, чтобы её не чистить, нужно придумать как отличать актуальные соединения от прошлых. И тут два варианта - либо таки триггер ON DISCONNECT, либо сверять табличку с MON$ATTACHENTS. Но последнее - ничуть не хуже чем просто обращение к MON$CONTEXT_VARIABLES.


А лучше и то и то.
Ибо, наличие триггера на дисконнект не гарантирует что будет корректно зафиксирован обрыв.
Например упал сервер. Да, нечасто, но это не исключено.

Кроме того, прикольный эффект - бэкапишь базу при наличии коннектов, ресторишь в сторонку, заглядываешь - а в ней в логе коннекты-призраки. Дисконнектов на момент бэкапа еще не было, а после рестора понятно что их уже нет.

И еще один момент для логов коннектов - после рестора CONNECTION_ID или как его там... начинается с нуля, заново, это значение нельзя использовать первичным ключом в логе коннектов.
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39215222
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraksналичие триггера на дисконнект не гарантирует что будет корректно зафиксирован обрыв.
Например упал сервер.... или пришёл ДБА и ввёл: delete from mon$attachments - тоже ничего не запишется
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39215384
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нечто требует длительного хранения, то почему не записать это нечто в обычную таблицу?
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39215395
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraksИ еще один момент для логов коннектов - после рестора CONNECTION_ID или как его там... начинается с нуля, заново, это значение нельзя использовать первичным ключом в логе коннектов.

понятное дело. В этой таблице ПК должен быть свой. А CONNECTION_ID использовать только для связи MON$ATTACHMENTS и собственной таблицы. Поскольку CONNECTION_ID не уникален и может присоединить и старые записи, то в условии соединения добавляем уточнение по времени коннекта. См. 19053329 . Вероятность коллизий при этом падает практически до нуля. Всякие экзотические случае с подкручиванием времени на сервере конечно не рассматриваются.
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / RDB$GET_CONTEXT() к другому пользователю ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]