2009-10-05 81 views
2

它考虑到以下几点:创建表,如果不存在

if object_id('MyTable') is null create table MyTable(myColumn int) 

是没可能有两个不同的电话可能既评估OBJECT_ID(“MyTable的”)为空,所以都试图创建表。

很明显,在这种情况下,两个调用者之一会失败,但理想情况下,没有调用者应该失败,而应该阻塞,另一个应该创建表,然后被阻止的调用者将看到object_id('MyTable')为非null并继续。

关于我可以应用独家锁定,这样我不会锁定超过绝对需要?

回答

2

您最初的检查后,创建表时使用try catch和如果错误是,该表已经存在,请继续,如果没有,你有一个更大的问题

0

我不认为,你应该担心这一点。

DDL语句不在事务下运行。另外,如果该表已经由来自第一个调用者的调用创建,则第二个调用者将失败。

+0

莫名其妙地不用担心第二个来电者失败会很不舒服。我宁愿第二个调用者无误地进行 – 2009-10-05 14:41:45

+1

@Ralph:有道理。这个程序多久执行一次?为什么你想在程序中创建一个表格?这是一个表,你会在程序结束时下降吗?如果没有,为什么不先创建一个真正的桌面?请解释你的情况,为什么你做这样的事情? – shahkalpesh 2009-10-05 14:54:20

0

我不允许用户创建表格。一般来说,这是一个不好的做法。如果他们需要插入数据,表格已经在那里。如果你担心两个人创建同一张桌子,你还担心他们的数据是否过关?我不知道你的proc是干什么的,但是如果它不喜欢删除记录,如果表存在,然后插入,那么如果两个用户在同一时间,你可能会有奇怪的结果。一般来说,如果您需要在运行时创建表,通常表明您的设计需要工作。

+1

-1答案是假定设计的优点。然而问题是实施细节的问题。 – 2009-10-05 15:36:52

+0

当我们看到一个糟糕的设计时,我们有责任指出这个问题可能不仅仅是设计问题的实现细节。 – HLGEM 2009-10-05 16:37:38

+0

@HLGEM在这种情况下,系统要求是使用此数据库的多线程服务可能会或可能不会配置为在审计表中记录错误信息。 如果配置为记录此审计信息,则假设创建该表。 如果未配置,则应该不存在错误审核表,因为现有的但空的审核表可能表示系统正常运行且未记录错误。 简而言之,这就是设计要求。 – 2009-10-05 18:10:58

1

通常CREATE TABLE从设置和安装脚本运行,并且期望安装脚本允许从单独的连接进行并发安装是不合理的。

我建议您使用安装/升级过程开始时获取的会话应用程序锁,请参阅sp_getapplock

相关问题