2009-01-12 84 views
1

我已經繼承了SQL Server數據庫,由於某些奇怪的原因,開發人員沒有使用Identity來自動增加主鍵。 (也許它曾經是一個Oracle的人,誰知道)。繼承的SQL Server數據庫問題

現在,由於數據庫是從無數客戶端訪問的,我認爲「下一個ID」必須存儲在數據庫的某個地方,以便它們不會相互衝突。如果我嘗試手動添加記錄,它會起作用,但當客戶端創建記錄時,它會失敗,說明密鑰已被使用。

如何確定它存儲在哪個表中,或者您可以在其他地方建議該ID可以存儲?

這可能有助於我知道下一個要生成的ID。因爲在任何表格的任何記錄中都可能找到值。 (如果不是,應該有:)

回答

1

檢查information_schema.constraint_column_usage查看所有其他人使用外鍵引用的表。

+0

好主意,沒有拿出任何東西。將它更改爲LIKE'%Next%'仍然沒有任何結果。 – 2009-01-12 17:45:46

+0

不知道爲什麼這很重要,因爲可能沒有提及生成列的表。或者至少我不明白我會如何實施它。 – 2009-01-12 17:50:49

0

它可能被存儲在代碼中,或者更糟糕的是,每次都在代碼中確定。例如插入之前,他們獲取最高的當前ID,然後加1並插入。

+0

對於有很多客戶的系統來說,這將是一個糟糕的問題!即你會得到比賽條件。兩個客戶端可能會嘗試使用相同的MAX + 1值。 – 2009-01-12 17:51:03

+0

但是,如果它在插入事務中完成,它可能不是問題。 – 2009-01-12 17:52:53

0

我見過這些系統中的一些。

  • 其中一個表具有自動編號,用於設置每個表上的標識。這被用來確保每個對象都有不同的ID。

  • 另一個項目是這樣給出的:從表中選擇max(id)+1。不要問我爲什麼;)

1

如果它使用存儲特效插入然後它可能在那裏。

0

解決問題並重新開始工作後,切換到Uniqueidentifier(GUID)。它們不僅可以在獨立的時間和空間中生成,消除競態條件,而且可以將它們用作ROWGUIDCOL用於複製目的。

0

找到它的最佳方法是查看插入記錄的代碼(動態存儲過程或從GUI執行的代碼)。通常,這種「設計」的系統不能正常工作,並且不會同時要求多個用戶同時詢問信息。客戶層面的失敗可能恰恰是因爲他們正處於競爭狀態。

如果你改變它使用身份(坦率地說,如果這樣會起作用,我寧願這樣做比使用GUIDS),你需要返回值插入到子表中,然後確保使用scope_identity ()返回剛剛插入的身份值,而不是@@ identity。

0

如果您運行SQL Server Profiler會話(假設您使用的是SQL Server 2005+),那麼該怎麼辦?該工具將顯示應用程序正在執行的查詢。如果下一個ID確實存儲在數據庫的表中,則應該在啓動時或插入記錄之前看到一個查詢。插入後,您還應該看到下一個ID正在更新。如果你沒有看到這些,也許你仍然會得到一些有價值的線索。

-1

運行跟蹤並查找插入以查看ID是否顯式從客戶端傳入。如果沒有,並且沒有sprocs,請檢查該表上是否存在觸發器。