Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / MDB+MS SQL Server единый идентификатор для сессий(сеансов) / 17 сообщений из 17, страница 1 из 1
02.10.2018, 16:25
    #39711814
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
Здравствуйте.
В связи с переходом с 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?
...
Рейтинг: 0 / 0
03.10.2018, 09:15
    #39712231
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
4d_monster,

В Access'е на самом деле нет временных таблиц, просто иногда "постоянную" таблицу используют так, как-будто она временная. Поэтому Вы наверное придумали свой "SessionID".
А вот в MS SQL Server как раз таки есть самые настоящие временные таблицы. Создайте с одной решёткой "#Table" если хотите, чтобы 1 юзер имел дело только со своей временной таблицей, ну или с двумя решётками "##Table", если хотите, чтобы все пользователи могли обращаться к этой таблице, пока она не удалилась. В чём проблемы?
Можно при создании таблицы указывать значения по умолчанию, и туда можно имя пользователя, ну или всё что угодно вписать. Да хоть IP адрес клиента, откуда пришёл запрос. И т.д., и т.п.
Многие вещи, которые Вы сделали в MS Access в MS SQL Server решается куда более изящно, там есть крутые инструменты. Поэтому слепо копировать решение для Access в MS SQL Server мне кажется не стоит. Надо смотреть на конкретную задачу.
...
Рейтинг: 0 / 0
03.10.2018, 09:56
    #39712257
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
К сожалению, моё знакомство с 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 мне кажется не стоит. Надо смотреть на конкретную задачу.Совершенно с вами согласен. Не стоит, но приходится... Эта необходимость и следует из конкретной задачи.
...
Рейтинг: 0 / 0
03.10.2018, 20:50
    #39712677
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
4d_monster,

вы так всё в общем описали, да если и честно, то не охота и вникать в суть этих сессий, временных таблиц и т.д., но на вскидку сдается мне что можно сделать все гораздо проще - не нужно никаких идентификаторов для временных данных - тупо сделайте эти таблицы локальными и всё, принцип такой - каждый экземпляр приложения должен иметь рядом автономный файл БД с таблицами для временных данных... и путаницы не будет и сопровождать проще, и надежнее, да и возможно работать будет быстрее и переносить ничего не нужно...
...
Рейтинг: 0 / 0
05.10.2018, 08:50
    #39713327
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
4d_monster...
Основной вопрос, как отобрать из прилинкованного как таблица VIEW только относящиеся к нужной сессии данные. И трудность только в определении на стороне сервере, какой же SessionID нужно сопоставить Connection в котором сам Access запросил данные. И если ничего придумать не удастся, то за SessionID будет принято Имя пользователя, хотя сейчас пользователей нет и не понятно, можно ли их будет завести.
...
Допустим у Вас есть некая таблица "Table1", где есть поле "SessionID", туда в момент ввода данных Ваша программу что-то пишет. ОК.
Ну так создайте VIEW типа так:
Код: sql
1.
2.
3.
CREATE VIEW v_Table1
SELECT * FROM Table1
WHERE SessionID = CASE User WHEN 'Иванов' THEN Тут некое число WHEN 'Петров' THEN Другое число и т.д. END


Или же создайте отдельную таблицу с именами пользователя / хоста и отдельное поле SessionID, а в представлении будете фильтровать данные в зависимости какой пользователь зашёл, такие данные и получил.


P.S.
На всякий случай: время входа и имя логина, а также IP адрес клиента в MS SQL Server можно узнать с помощью вот такого запроса:
Код: sql
1.
2.
3.
4.
SELECT sp.login_time, sp.loginame, dmec.client_net_address 
FROM sys.sysprocesses sp 
JOIN sys.dm_exec_connections dmec ON sp.spid = dmec.session_id
WHERE sp.spid = @@SPID
...
Рейтинг: 0 / 0
05.10.2018, 09:08
    #39713336
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
studieren,

Сделано с таблицей сессий. Но для исходного аксесса сессия определяется по имени хоста и полному имени интерфейсной базы. А после перехода на SQL Server получается только по имени хоста. (Или как вы предложили по имени Пользователя/Логина)

Для запускаемых/открываемых из кода используется единый настраиваемый Connection, и внутри него можно настроить вычисление SessionID как в Access.
А как поступить с прилинкованными VIEW и PassTrought запросами? Ведь для них Access использует свой Connection, который ещё(как я прочитал) создаётся и пересоздаётся по случайности и надобности Access.
Можно ли, например, в строке подключения TableDef.Connect указать параметр, доступный на стороне сервера?
...
Рейтинг: 0 / 0
05.10.2018, 09:22
    #39713347
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
4d_monster,

Access это одна среда, а MS SQL Server другая. Они друг у друга не видят что твориться у них внутри. Так что у Вас подход не правильный. SQL Server имеет дело с логином и IP адресом клиента (как я указал). Вот и думайте как поступить. А вот на сессию лучше не ориентироваться в MS SQL Server. Видите ли если юзер сегодня подключается к SQL, то получает одно значение сессии, а когда на следующий день подключается вновь, то получает совсем, совсем другое значение сессии. Как-то так.
...
Рейтинг: 0 / 0
05.10.2018, 09:27
    #39713349
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
studierenВидите ли если юзер сегодня подключается к SQL, то получает одно значение сессии, а когда на следующий день подключается вновь, то получает совсем, совсем другое значение сессии.
Иммено так. Поэтому и используется придуманное разделение на придуманные сессии по имени хоста и имени интерфейсной базы. Но как получать имя интерфейсной базы на стороне сервера - узнать не получается и, видимо придётся, загрубить разделение по сессиям до имени хоста.
...
Рейтинг: 0 / 0
05.10.2018, 12:50
    #39713526
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
4d_monster,

А зачем Вам имя хоста? IP адрес разве недостаточно?
А название базы данных:
Код: sql
1.
Select DB_NAME()
...
Рейтинг: 0 / 0
05.10.2018, 12:54
    #39713531
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
studieren,

Имя хоста так-же просто получить как и IP адрес, а использовать имя хоста, на мой взгляд, более правильно.
Название не самой базы на сервере, а имя интерфейсной базы Access, которая открыла прилинкованный View.
...
Рейтинг: 0 / 0
05.10.2018, 13:58
    #39713579
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
4d_monster,

Имя хоста
Код: sql
1.
select hostname from master.dbo.sysprocesses where spid=@@spid



А вот название БД Access, откуда поступил запрос вряд ли у SQL Server знает. Вряд ли. Вы сами как-то должны будете ухищряться отправить вместе с текстом запроса название БД Access.
...
Рейтинг: 0 / 0
05.10.2018, 14:36
    #39713613
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
studieren,

Даже проще:
Код: sql
1.
SELECT HOST_NAME()


А передать ничего нельзя. Только если как нибудь на стороне сервеора получить параметры из строки подключения.
...
Рейтинг: 0 / 0
05.10.2018, 15:45
    #39713675
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
4d_monsterА передать ничего нельзя. Только если как нибудь на стороне сервеора получить параметры из строки подключения. APP_NAME
Если подключаешься динамически, в коде, то пишешь в параметр коннект.стринга "Application Name" всё что тебе нужно, и потом, на сервере, через APP_NAME достаешь
...
Рейтинг: 0 / 0
05.10.2018, 16:01
    #39713691
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
court,
Спасибо большое!

А можно ли на сервере получать дополнительные параметры из ConnectionString?
ODBC;DSN=try;UID=User;PWD=pwd;DATABASE=db; CustomProperty=CustomValue
Или только с "Application Name" можно работать?
...
Рейтинг: 0 / 0
05.10.2018, 16:21
    #39713713
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
4d_monsterИли только с "Application Name" можно работать?Про другие не знаю.

В MS SQL есть своя спец.фича для сохранения информации в рамках сеанса
SET CONTEXT_INFO / CONTEXT_INFO()
т.е., подключился, "напхал" чего надо через SET CONTEXT_INFO
и потом, когда нужно, - достаёшь это "напханное" через CONTEXT_INFO()
Эта информация будет уникальная в рамках коннекта, и сохраняется пока коннект живой
...
Рейтинг: 0 / 0
08.10.2018, 12:21
    #39714337
Шыфл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
Когда я работал с MS SQL через акс, для разделения временных данных использовался HWND что есть глобальный идентификатор окна. На каждом подключаемом клиенте открывалось скрытое окно, которое делжало коннект и определяло HWND сеанса. Т.е. каждый мог видеть только свои данные. Данные чистились по времени, за вчера.
...
Рейтинг: 0 / 0
08.10.2018, 13:00
    #39714363
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDB+MS SQL Server единый идентификатор для сессий(сеансов)
Шыфл,

Тут беда ещё и в том, что время существования временных данных определяют действия пользователя, т.е. может они "освободятся" через 5 минут, а может через два дня.

Да и HWD хорош для терминального варианта, а не для работы по сети.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / MDB+MS SQL Server единый идентификатор для сессий(сеансов) / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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