2009-09-15 51 views
1

我們有一個數據庫,其中聯繫人只是軟刪除,即我們設置了一個名字刪除爲真。這個API處理這個問題,但有時你需要直接對數據庫運行查詢,並且很容易忘記這一點,並導出實際刪除的聯繫人。這不是一個大問題,因爲我已經習慣了系統,但是如果我正在度假,或者如果有其他人要接管,我想確保這些行不會被返回 - 除非特別要求。這給我們留下了以下兩個問題:你能告訴SQL Server不要返回特定的行嗎?

  1. 有沒有辦法告訴(在這種情況下,2005年)的SQL Server例如,如果一個位被設置爲true,不返回行?

  2. 如果是這樣,如果特別要求(如果bit ='true'),這些行仍可以被檢索嗎?

回答

5

我可以看到自動爲你做的唯一方法是創建相關表的視圖,明確排除刪除的行。然後在需要查看已刪除的數據時使用真正的表格。

+0

我會建議相同的。如果可行,創建一個視圖。這也消除了應用程序的責任來過濾掉已刪除的記錄。 – Pete 2009-09-15 08:08:24

+0

不幸的是,在這一點上我不認爲這是一種選擇 - 我有一種感覺,這應該早在設計階段就已經完成了。但這對未來的項目很有用。 – 2009-09-15 08:12:48

+0

那麼如果你還在開發中,你可以考慮將所有包含已刪除行的表重新命名爲tablename_base或類似的東西。這可以很好地工作,不需要更改代碼。這顯然需要一些測試。 – 2009-09-15 08:16:57

8

爲了選擇非刪除的行或刪除的文件,創建兩個觀點:

CREATE VIEW ActiveContacts 
AS 
    SELECT (list of fields) 
    FROM dbo.Contacts 
    WHERE deleted = 0 

CREATE VIEW DeletedContacts 
AS 
    SELECT (list of fields) 
    FROM dbo.Contacts 
    WHERE deleted = 1 

現在,您可以輕鬆地只需從積極或刪除的聯繫人挑:

SELECT (list of fields) 
FROM ActiveContacts 

SELECT (list of fields) 
FROM DeletedContacts 

這樣的話,你可以很容易地封裝了選擇標準,如果你不回你的觀點,「刪除」標誌,外部用戶甚至不會看到塔t旗,並不會知道它在那裏。

馬克

+1

我想他是在談論一種查詢數據庫的方式,而不需要指定where子句。如您所提及的最佳選擇是使用視圖。 – 2009-09-15 07:13:04

+0

是的,我的意思是Tannick說的。也許我對此有點不清楚。 – 2009-09-15 08:11:13

+0

@Yannick M.,你在說什麼?如果你只是_ASELECT *從ActiveContacts_(使用視圖@marc_s顯示你如何創建),你只會得到「活動」的聯繫人,沒有必要的地方 – 2009-09-15 13:27:26

1

您可以創建一個隱藏的那些行,如果你需要直接行,你仍然可以去表的視圖。嘗試創建視圖vwBlah AS SELECT表,列,去,在這裏從表名,WHERE標誌= 0.

相關問題