|
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
|
|||
---|---|---|---|
#18+
Здравствуйте. В связи с переходом с MDB+MDB на MDB+MS SQL Server, возникла следующая проблема: Для временых данных использовались общие таблицы, разделённые на сеансы по ключу SessionID. Для определения ключа SessionID велась единая таблица где хосту и полному имени базы приписывался код(счётчик). Для получения, изменение и удаления данных использовался готовый запрос с WHERE SessionID = getSessionID(). Функция getSessionID() вычисляла SessionID по имени хоста и базы. Теперь все таблицы и большая часть запросов переехали на SQL Server и требуется вычислять SessionID и в приложении Access и на самом сервере. Для вычисления в приложении ничего менять не требуется. А вот как лучше поступить с SQL Server мне ещё не понятно. Для запуска хранимых процедур, функций и открытия ADODB.Recordset в модулях используется один и тот же ADODB.Connection, для которого при открытии можно настроить соответствие SessionID и @@SPID. Тогда getSessionID() на сервере будет искать по @@SPID. Но как быть с прилинкованными как таблицы VIEW? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2018, 16:25 |
|
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
|
|||
---|---|---|---|
#18+
4d_monster, В Access'е на самом деле нет временных таблиц, просто иногда "постоянную" таблицу используют так, как-будто она временная. Поэтому Вы наверное придумали свой "SessionID". А вот в MS SQL Server как раз таки есть самые настоящие временные таблицы. Создайте с одной решёткой "#Table" если хотите, чтобы 1 юзер имел дело только со своей временной таблицей, ну или с двумя решётками "##Table", если хотите, чтобы все пользователи могли обращаться к этой таблице, пока она не удалилась. В чём проблемы? Можно при создании таблицы указывать значения по умолчанию, и туда можно имя пользователя, ну или всё что угодно вписать. Да хоть IP адрес клиента, откуда пришёл запрос. И т.д., и т.п. Многие вещи, которые Вы сделали в MS Access в MS SQL Server решается куда более изящно, там есть крутые инструменты. Поэтому слепо копировать решение для Access в MS SQL Server мне кажется не стоит. Надо смотреть на конкретную задачу. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2018, 09:15 |
|
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
|
|||
---|---|---|---|
#18+
К сожалению, моё знакомство с MS SQL Server довольно поверхностно, и на возникающие вопросы бывает трудно найти ответы из-за недостатка знания для правильного формулирования вопроса. studierenВ Access'е на самом деле нет временных таблиц, просто иногда "постоянную" таблицу используют так, как-будто она временная. Поэтому Вы наверное придумали свой "SessionID".Я писал не про временные таблицы, а про временные данные. Для хранения которых и используется постоянная таблица "как-будто она временная". А что-бы определять хозяина порции временных данных в постоянной общей таблице и используется придуманный SessionID. studierenА вот в MS SQL Server как раз таки есть самые настоящие временные таблицы. Создайте с одной решёткой "#Table" если хотите, чтобы 1 юзер имел дело только со своей временной таблицей, ну или с двумя решётками "##Table", если хотите, чтобы все пользователи могли обращаться к этой таблице, пока она не удалилась. В чём проблемы?Если бы я писал с нуля, я бы, возможно так и сделал бы, но я пытаюсь перевести уже существующее большое решение, поэтому необходимо минимизировать ручное вмешательство в процесс перевода. studierenМожно при создании таблицы указывать значения по умолчанию, и туда можно имя пользователя, ну или всё что угодно вписать. Да хоть IP адрес клиента, откуда пришёл запрос. И т.д., и т.п.Основной вопрос, как отобрать из прилинкованного как таблица VIEW только относящиеся к нужной сессии данные. И трудность только в определении на стороне сервере, какой же SessionID нужно сопоставить Connection в котором сам Access запросил данные. И если ничего придумать не удастся, то за SessionID будет принято Имя пользователя, хотя сейчас пользователей нет и не понятно, можно ли их будет завести. studierenМногие вещи, которые Вы сделали в MS Access в MS SQL Server решается куда более изящно, там есть крутые инструменты.Согласен. Но его неспособность полноценно работать с "динамическим SQL" очень мешает как раз при переходе с Access. studierenПоэтому слепо копировать решение для Access в MS SQL Server мне кажется не стоит. Надо смотреть на конкретную задачу.Совершенно с вами согласен. Не стоит, но приходится... Эта необходимость и следует из конкретной задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2018, 09:56 |
|
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
|
|||
---|---|---|---|
#18+
4d_monster, вы так всё в общем описали, да если и честно, то не охота и вникать в суть этих сессий, временных таблиц и т.д., но на вскидку сдается мне что можно сделать все гораздо проще - не нужно никаких идентификаторов для временных данных - тупо сделайте эти таблицы локальными и всё, принцип такой - каждый экземпляр приложения должен иметь рядом автономный файл БД с таблицами для временных данных... и путаницы не будет и сопровождать проще, и надежнее, да и возможно работать будет быстрее и переносить ничего не нужно... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2018, 20:50 |
|
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
|
|||
---|---|---|---|
#18+
4d_monster... Основной вопрос, как отобрать из прилинкованного как таблица VIEW только относящиеся к нужной сессии данные. И трудность только в определении на стороне сервере, какой же SessionID нужно сопоставить Connection в котором сам Access запросил данные. И если ничего придумать не удастся, то за SessionID будет принято Имя пользователя, хотя сейчас пользователей нет и не понятно, можно ли их будет завести. ... Допустим у Вас есть некая таблица "Table1", где есть поле "SessionID", туда в момент ввода данных Ваша программу что-то пишет. ОК. Ну так создайте VIEW типа так: Код: sql 1. 2. 3.
Или же создайте отдельную таблицу с именами пользователя / хоста и отдельное поле SessionID, а в представлении будете фильтровать данные в зависимости какой пользователь зашёл, такие данные и получил. P.S. На всякий случай: время входа и имя логина, а также IP адрес клиента в MS SQL Server можно узнать с помощью вот такого запроса: Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2018, 08:50 |
|
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
|
|||
---|---|---|---|
#18+
studieren, Сделано с таблицей сессий. Но для исходного аксесса сессия определяется по имени хоста и полному имени интерфейсной базы. А после перехода на SQL Server получается только по имени хоста. (Или как вы предложили по имени Пользователя/Логина) Для запускаемых/открываемых из кода используется единый настраиваемый Connection, и внутри него можно настроить вычисление SessionID как в Access. А как поступить с прилинкованными VIEW и PassTrought запросами? Ведь для них Access использует свой Connection, который ещё(как я прочитал) создаётся и пересоздаётся по случайности и надобности Access. Можно ли, например, в строке подключения TableDef.Connect указать параметр, доступный на стороне сервера? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2018, 09:08 |
|
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
|
|||
---|---|---|---|
#18+
4d_monster, Access это одна среда, а MS SQL Server другая. Они друг у друга не видят что твориться у них внутри. Так что у Вас подход не правильный. SQL Server имеет дело с логином и IP адресом клиента (как я указал). Вот и думайте как поступить. А вот на сессию лучше не ориентироваться в MS SQL Server. Видите ли если юзер сегодня подключается к SQL, то получает одно значение сессии, а когда на следующий день подключается вновь, то получает совсем, совсем другое значение сессии. Как-то так. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2018, 09:22 |
|
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
|
|||
---|---|---|---|
#18+
studierenВидите ли если юзер сегодня подключается к SQL, то получает одно значение сессии, а когда на следующий день подключается вновь, то получает совсем, совсем другое значение сессии. Иммено так. Поэтому и используется придуманное разделение на придуманные сессии по имени хоста и имени интерфейсной базы. Но как получать имя интерфейсной базы на стороне сервера - узнать не получается и, видимо придётся, загрубить разделение по сессиям до имени хоста. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2018, 09:27 |
|
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
|
|||
---|---|---|---|
#18+
4d_monster, А зачем Вам имя хоста? IP адрес разве недостаточно? А название базы данных: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2018, 12:50 |
|
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
|
|||
---|---|---|---|
#18+
studieren, Имя хоста так-же просто получить как и IP адрес, а использовать имя хоста, на мой взгляд, более правильно. Название не самой базы на сервере, а имя интерфейсной базы Access, которая открыла прилинкованный View. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2018, 12:54 |
|
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
|
|||
---|---|---|---|
#18+
4d_monster, Имя хоста Код: sql 1.
А вот название БД Access, откуда поступил запрос вряд ли у SQL Server знает. Вряд ли. Вы сами как-то должны будете ухищряться отправить вместе с текстом запроса название БД Access. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2018, 13:58 |
|
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
|
|||
---|---|---|---|
#18+
studieren, Даже проще: Код: sql 1.
А передать ничего нельзя. Только если как нибудь на стороне сервеора получить параметры из строки подключения. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2018, 14:36 |
|
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
|
|||
---|---|---|---|
#18+
4d_monsterА передать ничего нельзя. Только если как нибудь на стороне сервеора получить параметры из строки подключения. APP_NAME Если подключаешься динамически, в коде, то пишешь в параметр коннект.стринга "Application Name" всё что тебе нужно, и потом, на сервере, через APP_NAME достаешь ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2018, 15:45 |
|
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
|
|||
---|---|---|---|
#18+
court, Спасибо большое! А можно ли на сервере получать дополнительные параметры из ConnectionString? ODBC;DSN=try;UID=User;PWD=pwd;DATABASE=db; CustomProperty=CustomValue Или только с "Application Name" можно работать? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2018, 16:01 |
|
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
|
|||
---|---|---|---|
#18+
4d_monsterИли только с "Application Name" можно работать?Про другие не знаю. В MS SQL есть своя спец.фича для сохранения информации в рамках сеанса SET CONTEXT_INFO / CONTEXT_INFO() т.е., подключился, "напхал" чего надо через SET CONTEXT_INFO и потом, когда нужно, - достаёшь это "напханное" через CONTEXT_INFO() Эта информация будет уникальная в рамках коннекта, и сохраняется пока коннект живой ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2018, 16:21 |
|
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
|
|||
---|---|---|---|
#18+
Когда я работал с MS SQL через акс, для разделения временных данных использовался HWND что есть глобальный идентификатор окна. На каждом подключаемом клиенте открывалось скрытое окно, которое делжало коннект и определяло HWND сеанса. Т.е. каждый мог видеть только свои данные. Данные чистились по времени, за вчера. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2018, 12:21 |
|
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
|
|||
---|---|---|---|
#18+
Шыфл, Тут беда ещё и в том, что время существования временных данных определяют действия пользователя, т.е. может они "освободятся" через 5 минут, а может через два дня. Да и HWD хорош для терминального варианта, а не для работы по сети. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2018, 13:00 |
|
|
start [/forum/topic.php?fid=45&fpage=43&tid=1611129]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
others: | 300ms |
total: | 472ms |
0 / 0 |