Microsoft SQL Server创建会话特定的同义词

时间:2017-11-14 09:46:01

标签: sql-server session synonym

我正在开发一个数据库,该数据库在每个会话的不同表中保存特定的会话数据。例如我有一个名为ProductsABCD的表,它保存该会话可见的产品,其中ABCD是会话ID。不优雅,但我必须与之合作。目前,我将以以下格式访问此数据:

DECLARE @Session AS VARCHAR(MAX) = 'ABCD'
DECLARE @strSQL AS VARCHAR(MAX)

SET @strSQL = 'SELECT * FROM Products' + @Session
EXEC (@strSQL)

一个非常简化的版本,但任何使用过动态SQL的人都会告诉你这个变得非常难看。我目前正在研究使用同义词的选项。我可以在动态SQL中设置它们,然后在没有动态的情况下访问同义词。 e.g。

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

虽然只有一个用户在测试时才有效,但当多个用户在线时它不是一个可行的选项,因为同义词可以全局访问。有没有人知道创建一个只能一次访问一个会话的同义词的方法?类似于临时表只能由单个会话访问。

非常感谢。

其他信息:

这里的情况是,这里有一些业务逻辑可以定义哪些产品是可见的,显示什么价格,哪些库存水平可以访问等等。每个都存储在会话启动时创建的全局表中,并且然后在会话处理或计时器上清理。

这些不能存储在临时表中,因为生命周期在设置存储过程结束时到期。由于系统中可用的会话数量/数量很多,因此不能将会话参数作为字段保存在单个表中。这是在分区真的是一个选项之前开发的。还需要对存储过程进行重大修改 - 请记住这是一个继承的现有系统。

此处的数据库会话是一个IIS会话,它打开与数据库的单个连接并保持该会话打开。然后通过在注销时发送的配置会话或通过清除任何未正确处理的旧会话的计时器来清除它。

我会寻找一个在连接期间唯一的同义词,或者只在特定的存储过程调用期间查找。如果同义词不可用于其他会话或存储过程,则两者都可以工作。

1 个答案:

答案 0 :(得分:1)

规避此任务的可能方法是创建每会话用户,将所有表放在每个会话模式中,使此模式默认为此用户,使用execute as <session-user>运行所有表,而不在表之前指定模式。可以做的事情 - 保持具有相同名称的表(但在不同的模式中)。但在这种情况下,你最好在dbo模式中使用hothing。也许有一天会尝试重新思考整个解决方案。