2011-03-16 61 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將發生更改。取而代之(或另外),存儲數據庫名稱。

相關問題