2012-12-18 35 views
0

目前,我有一個數據庫將布爾字段存儲爲VARCHAR(1)('T'或'F')。我想用BIT替換這些。問題在於,這需要在使用數據庫的程序中進行大量更改。所以我認爲合乎邏輯的步驟是添加一個BIT字段並用我可以訪問的計算列替換現有的VARCHAR(1)字段而不是訪問BIT字段(因此程序可以繼續按原樣繼續工作而不會更改,並且可以更改隨着時間的推移使用BIT字段)。更新計算列,將VARCHAR轉換爲BIT

我知道這不起作用(UPDATE和INSERT不適用於計算列)。我知道一個選擇是重命名現有的表並添加一個視圖來訪問它,但我不認爲這是一個可行的解決方案,因爲添加和刪除列,更改從屬視圖等將容易出錯(在我看來這不是一個完美的解決方案)。

我的問題是 - 我有什麼選擇來實現上述行爲(例如,程序可以繼續按原樣工作)?

一個例子:

User (Active VARCHAR(1), ...) 

更改爲使用計算列:(無效)

User (Active_B BIT, Active AS CASE Active_B WHEN 1 THEN 'T' ELSE 'F' END, ...) 

更新:例如在固定誤差。

+1

不幸的是,你不能吃蛋糕,也吃不了它。您已經說明了解決方案(s)及其所有缺點... –

回答

0

一個選項是同時具有VARCHAR和BIT字段,並使用觸發器在它們之間進行更新。

我只需要弄清楚如何防止無限遞歸(一個想法是讓一個字段除了檢查這個觸發器是否是由另一個觸發器中的更新產生的,並沒有其他目的(檢查我們是否正在更新它並將其包含在觸發器的更新中))。更新需要兩種方式來實現簡單的向後兼容性。

1

它必須是:

ALTER TABLE dbo.User 
ADD Active AS CASE Active_B WHEN 1 THEN 'T' ELSE 'F' END PERSISTED 

您需要在CASE使用列名(不是數據類型)。而且我建議讓計算列持續 - 以便將值存儲在磁盤上(並且每次訪問它時都不會重新計算)。

+0

我剛剛在我的示例中犯了一個錯誤。這仍然不能解決我的問題,因爲INSERT和DELETE查詢不起作用(在VARCHAR字段上)。 – Dukeling

+0

@Dukeling:那麼你另外需要'INSTEAD OF INSERT/UPDATE'觸發器來「捕捉」這些情況並處理它們 –

+0

使用INSTEAD OF觸發器我可能不得不做一些相當複雜的事情來讓它排除Active和include查詢中的Active_B(並保持所有其他字段相同),對不對? – Dukeling