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

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

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

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

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

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

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

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

Код: plaintext
select rdb$character_set_name from rdb$database
...
Рейтинг: 0 / 0
13.04.2016, 15:46
    #39214779
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RDB$GET_CONTEXT() к другому пользователю ?
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
13.04.2016, 16:56
    #39214886
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RDB$GET_CONTEXT() к другому пользователю ?
Таблоид,

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

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

$ /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
13.04.2016, 17:05
    #39214898
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RDB$GET_CONTEXT() к другому пользователю ?
Arioch,

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

А для отдельной спец-таблички, чтобы её не чистить, нужно придумать как отличать актуальные соединения от прошлых. И тут два варианта - либо таки триггер 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
13.04.2016, 18:13
    #39215020
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RDB$GET_CONTEXT() к другому пользователю ?
Симонов ДенисИбо их количество ограничено

И с другой стороны, это ограничение - на соединение, или на процес сервера ?
...
Рейтинг: 0 / 0
13.04.2016, 18:29
    #39215044
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RDB$GET_CONTEXT() к другому пользователю ?
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
13.04.2016, 18:41
    #39215057
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RDB$GET_CONTEXT() к другому пользователю ?
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
13.04.2016, 18:57
    #39215068
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RDB$GET_CONTEXT() к другому пользователю ?
Симонов ДенисВлад только сказал, что значения контекстных переменных всех сессий можно найти в таблице мониторинга MON$CONTEXT_VARIABLES.Именно так
...
Рейтинг: 0 / 0
14.04.2016, 05:33
    #39215183
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RDB$GET_CONTEXT() к другому пользователю ?
AriochА для отдельной спец-таблички, чтобы её не чистить, нужно придумать как отличать актуальные соединения от прошлых. И тут два варианта - либо таки триггер ON DISCONNECT, либо сверять табличку с MON$ATTACHENTS. Но последнее - ничуть не хуже чем просто обращение к MON$CONTEXT_VARIABLES.


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

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

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

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


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