究竟何时有多个用户无法同时使用临时表运行存储过程?


9

我对最近在TechNet上阅读的有关Temp Tables的文档有疑问。该页面上“ 临时表”部分的第四段内容如下:

如果使用命名约束创建了一个临时表,并且该临时表是在用户定义的事务范围内创建的,则一次只能有一个用户可以执行创建临时表的语句。例如,如果存储过程创建具有命名主键约束的临时表,则该存储过程不能由多个用户同时执行。

我在这样一个环境中工作:我们大量使用了一些使用索引临时表的存储过程,而我们从未遇到过用户必须等待一个执行完成才能开始下一个执行的问题。我希望情况会继续如此,但我担心,如果未正确理解此警告,可能会成为一个问题。

具体来说,我不清楚以下几点:

  1. 这仅适用于全局临时表还是局部临时表?一个在会话外部不可见的表(在后一种情况下)会阻止另一个会话同时执行,这似乎很奇怪。
  2. 什么才算是“命名约束”?并非所有约束都具有名称(即使它们是系统生成的)?这是否指的是具有用户定义别名的约束?对我来说,这似乎是措辞不好。
  3. “多个用户”实际上意味着多个会话吗?这些过程是通过使用单个服务帐户的应用程序调用的,因此99.9%的脚本调用是由该单个帐户进行的(对于管理员偶尔在后端进行的调用,我并不担心)。如果服务帐户可以同时在多个会话中运行该存储过程,那么出于我的目的,这个问题就没有意义了。

1
您提到您的临时表已建立索引,但问题是关于约束。索引不是约束。对一个人正确的事实可能对另一个人正确或不正确。在这种情况下,与约束不同,索引名称可以在数据库中重复。索引名称不能在单个表上重复。因此,命名索引不会引起命名约束的问题。
Shannon Severance

@Shannon,的确,在我撰写问题时,我对此感到困惑。我认为我在示例代码和文档中看到的PRIMARY KEY CLUSTERED与PRIMARY KEY的大量使用使我相信聚簇索引是约束。而且,通过扩展,可以推断所有索引都是约束。我早些时候做了一个简短的下午阅读,这为我清除了这个问题。
韦斯利·马歇尔

Answers:


10

我认为这是因为您在中不能有任何重复的名称tempdb.sys.key_constraints。这是我的一台服务器上的元数据视图中的内容:

初步观点

以奇数结尾的所有奇数名称_6E...都是SQL Server自动生成的名称。它们没有命名约束,因为在创建它们时我没有明确给它们命名。SQL Server在幕后生成一个约束名称,从理论上讲可以避免名称冲突。

如果我尝试在两个不同的会话中创建下表:

create table #x1 (
ID INT NOT NULL,
CONSTRAINT NAMED_CONSTRAINT_1 PRIMARY KEY (ID)
);

运行第二个的人抛出一个错误:

Msg 2714,第16级,状态5,第1行

数据库中已经有一个名为“ NAMED_CONSTRAINT_1”的对象。

消息1750,第16级,状态1,第1行

无法创建约束或索引。请参阅先前的错误。

再次签出视图:

有约束

如果我尝试在两个会话中创建下表,则没有问题:

create table #y1 (
ID INT NOT NULL,
PRIMARY KEY (ID)
);

这是元数据视图:

具有默认约束

只是直接回答您的问题:您引用的部分适用于本地和全局临时表,命名约束是您故意为其命名的约束,并且多个用户意味着多个会话。


11

这适用于本地临时表。

命名约束和未命名约束之间的区别是:

CREATE TABLE #t1 (c1 INT PRIMARY KEY CLUSTERED)

CREATE TABLE #t2 (c1 INT,
                     CONSTRAINT pk_c1 PRIMARY KEY  CLUSTERED(c1) )

设置系统名称约束后,极不可能发生冲突。在此示例中,如果您在SSMS中打开两个窗口,则可以在两个窗口中创建#t1,但不能在其中创建#t2

全局临时表由所有用户共享,因此您必须以不同的方式进行处理。在使用它们完成最后一个会话之前,它们不会被“破坏”,因此您需要确保当用户访问它们时,他们只能访问其数据。有时这是通过SPID完成的,其他时候是通过哈希值完成的。这取决于如何使用全局临时表。

通常,对于全局临时表,存储过程将检查它们是否存在,然后仅在OBJECT_ID()is是的情况下创建它们NULL

多个用户意味着多个会话。登录名与它无关。如果George运行sp_something @i = 1而Gina运行sp_something @i = 2,则两者都以身份登录并不重要User1,它们将具有不同的SPID。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.