Я работаю над базой данных, в которой хранятся определенные данные сеанса в отдельных таблицах для каждого сеанса. например У меня была бы таблица с именем ProductsABCD, в которой хранятся продукты, видимые для этого сеанса, где ABCD — идентификатор сеанса. Не изящно, но то, с чем мне приходится работать. В настоящее время я бы получил доступ к этим данным в формате:
DECLARE @Session AS VARCHAR(MAX) = 'ABCD'
DECLARE @strSQL AS VARCHAR(MAX)
SET @strSQL = 'SELECT * FROM Products' + @Session
EXEC (@strSQL)
Очень упрощенная версия, но любой, кто когда-либо использовал Dynamic SQL, скажет вам, как быстро это становится очень уродливым. В настоящее время я изучаю вариант использования синонимов. Я могу настроить их в динамическом SQL, а затем получить доступ к синониму без динамического. например
DECLARE @Session AS VARCHAR(MAX) = 'ABCD'
DECLARE @strSQL AS VARCHAR(MAX)
SET @strSQL = 'CREATE SYNONYM myProducts FOR Products' + @Session
EXEC (@strSQL)
SELECT *
FROM myProducts
DROP SYNONYM myProducts
Хотя это работает, когда тестирует только один пользователь, это нежизнеспособный вариант, когда несколько пользователей находятся в сети, поскольку синоним доступен глобально. Кто-нибудь знает способ создать синоним, доступный только для одного сеанса за раз? Подобно тому, как временная таблица может быть доступна только для одного сеанса.
Большое спасибо.
Дополнительная информация:
Обстоятельства здесь таковы, что здесь действует некоторая бизнес-логика, которая определяет, какие продукты видны, какие цены отображаются, какие уровни запасов доступны и т. д. Каждый из них хранится в глобальных таблицах, создаваемых при запуске сеанса, а затем очищается. либо в сеансе, либо по таймеру.
Их нельзя хранить во временных таблицах, потому что время жизни истекает, когда завершается хранимая процедура установки. Невозможно хранить в одной таблице с параметром сеанса в качестве поля из-за большого количества сеансов/количества данных, доступных в системе. Это было разработано до того, как разделение стало действительно возможным. Также потребуется серьезная переработка хранимых процедур — помните, что это унаследованная существующая система.
Сеанс db здесь — это сеанс IIS, который открывает одно соединение с базой данных и удерживает этот сеанс открытым. Затем это очищается с помощью сеанса удаления, отправленного при выходе из системы, или с помощью таймера, который очищает все старые сеансы, которые не были удалены должным образом.
Я бы искал синоним, который уникален либо на период соединения, либо только на время конкретного вызова хранимой процедуры. Любой из них будет работать, если синоним недоступен для другого сеанса или хранимой процедуры.