0

現在、ブールフィールドをVARCHAR(1)('T'または'F')として格納するデータベースがあります。これらをBITに置き換えたい。問題は、これにはデータベースを使用するプログラムに大量の変更が必要になることです。したがって、論理的な手順は、BITフィールドを追加し、既存のVARCHAR(1)フィールドを、BITフィールドにアクセスするのではなく、アクセスする計算列に置き換えることだと思いました(したがって、プログラムは変更なしでそのまま動作し続け、変更できます)時間の経過とともにBITフィールドを使用します)。

私はこれが機能しないことを知っています(UPDATEとINSERTは計算列では機能しません)。1つのオプションは、既存のテーブルの名前を変更し、それにアクセスするためのビューを追加することですが、列の追加と削除、依存ビューの変更などがエラーを起こしやすいため、実行可能なソリューションとしてはわかりません(そしてそれは私の意見ではきちんとした解決策ではありません)。

私の質問は-上記の動作を達成するための私のオプションは何ですか(プログラムがそのまま動作し続けることができるように)?

例:

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

計算列を使用するように変更:(機能しません)

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

更新:例のエラーを修正しました。

4

2 に答える 2

1

次のようにする必要があります。

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

で列名(データ型ではない)を使用する必要がありますCASE。また、計算列も永続化して、値が実際にディスクに保存されるようにすることをお勧めします(アクセスするたびに再計算されないようにします)。

于 2012-12-18T12:54:34.357 に答える
0

オプションは、VARCHARフィールドとBITフィールドの両方を持ち、トリガーを使用してそれらの間で更新することです。

無限再帰を防ぐ方法を理解する必要があります(1つのアイデアは、このトリガーが別のトリガー内の更新の結果であるかどうかを確認する以外の目的を果たさないフィールドを持つことです(更新しているかどうかを確認して含めます)トリガーの更新で))。下位互換性を容易にするために、更新は双方向で行う必要があります。

于 2012-12-18T13:33:44.437 に答える