powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / RDB$GET_CONTEXT() к другому пользователю ?
32 сообщений из 32, показаны все 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
RDB$GET_CONTEXT() к другому пользователю ?
    #39215440
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисfraksИ еще один момент для логов коннектов - после рестора CONNECTION_ID или как его там... начинается с нуля, заново, это значение нельзя использовать первичным ключом в логе коннектов.

понятное дело. В этой таблице ПК должен быть свой. А CONNECTION_ID использовать только для связи MON$ATTACHMENTS и собственной таблицы. Поскольку CONNECTION_ID не уникален и может присоединить и старые записи, то в условии соединения добавляем уточнение по времени коннекта. См. 19053329 . Вероятность коллизий при этом падает практически до нуля. Всякие экзотические случае с подкручиванием времени на сервере конечно не рассматриваются.

Ну у меня примерно так и сделано.
Триггер на коннект записывает в лог.
Триггером на дисконнект записывает время дисконнекта в ту же самую запись где коннект, определяет ее как последнюю запись с таким же connection_id.
При просмотре лога к нему приджойниваются текущие коннекты из мониторинга и таким образом видно где активные ныне коннекты а где вследствие тех или иных причин дисконнект не записался.
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39215616
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис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  




и все активные соединения со специфическими атрибутами как на ладони.

ну ты практически дословно повторил мой пост

Ariochибо сверять табличку с MON$ATTACHENTS. Но последнее - ничуть не хуже чем просто обращение к MON$CONTEXT_VARIABLES.

Понимаеш, да? ты только что меня ругал за обращение к мониторинговым таблицам - и тепер сам же предлагаешь к ним обращаться. Ну как бы или трусы - или крестик.

Избавиться от обращения к мониторингу вообще можно только отдельной таблице и ON DISCONNECT триггером, как я и псал с самого начала, чем тебя удивил
Симонов ДенисПро самоочищающиеся таблицы не понял. Нафига? Чем GTT не устраивают?

А если же всё же выбрать обращаться к мониторинговым таблицам, то нафига мне костыли с MON$ATTACHMENTS если я нужные мне данные напрямую возьму из MON$CONTEXT_VARIABLES ?

Ну разве что проще в DBGrid запихнтуть без разворота переменных в "шаxматку"
...
Рейтинг: 0 / 0
RDB$GET_CONTEXT() к другому пользователю ?
    #39215628
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидСообщений типа 'can not transliterate блаблабла' не видно.

А uх и не может быть, NONE и в Aфрике NONE


Таблоиддля линуха пробовал с -ch utf8 и -ch koi8r -- результат одинаковый

в смысле он под KOI8-кодировкой соединения умудрился греческие буквы вставить??? O_O

...а в целом если повторят ьв точности то под линуксом надо тоже аналог chcp делать.
Сейчас уже точно не помню как, возможно хватит
Код: plaintext
export LC_ALL=... 
а м.б. и другие LC_* переменные.

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

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

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

У меня - не требует, мне может понадобиться информация о ТЕКУЩИХ подключениия, "кто здесь?" и "зачем ты здесь?", потому и смотрю на контeкстные переменные USER_SESSION, исчезающие вместе с самими соединениями

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

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


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