2011-03-16 56 views
4

我需要知道是否在Sql Server 2008中的数据库中(也想知道2005和2000有什么区别),出于某种原因,表格会有变化的object_id。在Sql Server中,对象的object_id是否可以更改?

Ex。通过删除和创建来改变表的id,在什么情况下选择以某种方式改变表,如果有的话,而不是改变表的任何其他方式。

我一直无法在网上找到任何可以说是非常具体的东西,就像白皮书或MSDN文章。我发现了这个谈话:http://sql-server-performance.com/Community/forums/p/5918/167487.aspx

起初谈话基本上是“不”,然后它似乎做了180.我也正在寻找任何答案的合法引用。我不是那种对实际的Sql Server设计珍品前面的实验感兴趣的,以防在行为改变的奇怪情况下。例如,它可能会丢弃并重新创建以更改表格,但仅当它为空时才会更改;但如果它有数据,它不会改变ID ...等等。我可以看到有人可能会想出一个看起来正确但不完整的答案,而不是通过这样做的整个故事。

对于这个问题的冗长啰嗦,可能不充分描述和挑剔的性质,事先道歉。

+0

你的解决方案需要持久化object_id吗?可能有不同的方式去实现你想要实现的目标。 – 2011-03-16 20:22:09

+0

就我所见,该线程似乎没有达到180。在SSMS中更改身份属性的示例不是“更改表”操作,SSMS将删除并重新创建该表。 – 2011-03-16 20:24:28

回答

4

object_id是在创建对象时分配的。唯一会改变的是如果对象被重新创建。

SSMS在幕后做的一些事情实际上涉及删除和重新创建表(在某些情况下,甚至可能不需要)。例如,如果将一列添加到表的中间,则需要删除并重新创建 - 因此是一个新的object_id。

在任何情况下,你永远不应该坚持从数据库中OBJECT_ID任何地方,只是以后每次使用object_id([objectname])

+1

“无论如何,你永远不应该在任何地方从数据库中持久保存object_id” - 听起来像我真正需要知道的! – justin 2011-03-16 22:00:48

1

一种方式查询它的OBJECT_ID 可能来坚持,不知不觉中,是如果一些“聪明”的程序员创建了一个auditTrail表,它使用objectids而不是表名(你决定这是否是一个聪明的主意)。数据更改时,将存储object_id()和标识列。

上面的问题,我认为还没有得到回答,是否object_id值实际上会持续存在,如将数据库还原到另一台服务器,升级sql server版本,跨不同群集主机进行数据库故障转移等

是否尝试使用object_id的持久值是一个好主意是另一个问题(我相信上面已经回答“NO;不是一个好主意”)。如果SSMS在幕后丢弃并重新创建表,那么没有足够的理由不使用object_id

+0

*聪明*和*之间有一条细线,超过工程*和*蝙蝠狗屎疯狂* – SQLMason 2013-12-16 17:17:33

0

当SQL Server在内部重新创建表时,object_id将发生更改。取而代之(或另外),存储数据库名称。

相关问题