gpt4 book ai didi

sql-server - MS SQL Server - 安全并发使用全局临时表?

转载 作者:行者123 更新时间:2023-12-02 23:18:28 26 4
gpt4 key购买 nike

在 MS SQL Server 中,我使用全局临时表来存储客户端传递的 session 相关信息,然后在触发器内使用该信息。

由于同一个全局临时表可以在不同的 session 中使用,并且当我想写入它时它可能存在也可能不存在(取决于之前使用它的所有先前 session 是否都已关闭),所以我正在做一个在写入之前检查我创建的全局临时表是否存在。

IF OBJECT_ID('tempdb..##VTT_CONTEXT_INFO_USER_TASK') IS NULL
CREATE TABLE ##VTT_CONTEXT_INFO_USER_TASK (
session_id smallint,
login_time datetime,
HstryUserName VDT_USERNAME,
HstryTaskName VDT_TASKNAME,
)

MERGE ##VTT_CONTEXT_INFO_USER_TASK As target
USING (SELECT @@SPID, @HstryUserName, @HstryTaskName) as source (session_id, HstryUserName, HstryTaskName)
ON (target.session_id = source.session_id)
WHEN MATCHED THEN
UPDATE SET HstryUserName = source.HstryUserName, HstryTaskName = source.HstryTaskName
WHEN NOT MATCHED THEN
INSERT VALUES (@@SPID, @LoginTime, source.HstryUserName, source.HstryTaskName);

问题在于我检查表是否存在和MERGE之间声明中,如果之前使用临时表的所有 session 恰好在该实例中关闭(这实际上发生在我的测试中),则 SQL Server 可能会删除临时表。

是否有关于如何避免此类并发问题的最佳实践,即在检查表的存在性和后续使用之间不会删除表?

最佳答案

“全局临时表”和“触发器”的概念就是不相契合。表是永久数据存储,它们的属性也是如此——包括触发器。当服务器重新启动时,临时表将被删除。为什么有人会设计一个永久代码块(触发器)依赖于临时共享存储机制的系统?这似乎是失败的秘诀。

不要使用全局临时表,而是使用真实表。如果您愿意,可以在名称前面添加一个有用的前缀,例如 temp_。如果该表由数据库共享,则将其放入所有代码都可以访问的数据库中。

创建表一次并将其留在那里(删除行即可),以便触发器代码可以访问它。

关于sql-server - MS SQL Server - 安全并发使用全局临时表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34923027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com