2013-08-12 24 views
6

SQL Serverに既存のテーブルが存在します(実際には100万以上)。既存のSQL Serverテーブルに列を追加する - 含意

この表は、フロントエンドアプリケーションによって定期的に更新、挿入、選択されます。たとえば、datetime列を追加する必要があります。ボタンはフロントエンドに押されますと、ストアドプロシージャが呼び出されるたび

UPDATE Table SET M_DateModified = GETDATE() 

:そうのように更新することができM_DateModified。この列は、必要に応じて既存のレポートに追加されます。

私の問題とその答えはこれです。私たちのアプリのコアテーブルの一つとして、ALTERINGテーブルを追加し、追加の列を追加する他の既存のクエリを壊す?明らかに、既存のINSERTクエリが壊れてしまうように、すべての列のすべての値を指定せずにテーブルに挿入することはできません(WHICHは大きな問題です)。

この問題に関する最善の解決策については、何か助けをいただければ幸いです。

+3

ひどく設計された**クエリ - 明示的に列のリスト**を指定していない 'SELECT * FROM ....'や 'INSERT'クエリなどを挿入してしまうようなものです。 –

+4

あなたは "*明らかに、すべての列のすべての値を指定せずに表に挿入することはできません*"。本当じゃない。 – RBarryYoung

+1

おっと、@RBarryYoungよろしくお願いいたします。単純な挿入では、「列名または指定された値の数がテーブル定義と一致しません」というメッセージが表示されます。たとえば、テーブルに7が必要な場所に5つの値しか指定しないとしたら?私のnoobnessを許す、私はこれで新しいです:) – frans

答えて

6

最初に、marc_sによれば、それはSELECT *のクエリにのみ影響し、それらのすべてが必ずしも影響を受けるわけではありません。

は第二に、あなたはあなたがそれがNULL可能な作る場合、あなたはそのことについて心配する必要はありませんので、INSERT上のすべての非ヌルフィールドを指定する必要があります。さらに、Created_Dateタイプの列の場合は、DEFAULTの設定を=GetDate()に追加するのが一般的です。指定されていない場合は、それを埋め込みます。あなたはまだあなたの既存のコードベースに影響を与える心配している場合

第三に、次の操作を行います。

  1. は「physicalTable」のようなものにしてテーブルの名前を変更します。
  2. SELECT .. FROM physicalTableと同じ名前のテーブルを作成します。列は明示的に同じ順序で表示されますが、M_DateModifiedフィールドは含まれません。
  3. テーブルに直接アクセスするのではなく、コードを変更せずにそのままビューを参照してください。

これで、コードを変更せずにテーブルと安全にやりとりできます(SQL DMLコードでは、テーブルとこのような書き込み可能なビューの違いはわかりません)。

、自動的に設定します挿入&更新トリガを追加することで、それがNULL可能なことにより最初、最後に、「ModifiedDate」欄のこの種の一般的な必要性で、最も頻繁に処理されます。

UPDATE t 
SET M_DateModified = GetDate() 
FROM (SELECT * FROM physicalTable y JOIN inserted i ON y.PkId = i.PkId) As t 

この方法では、アプリケーションはフィールド自体を維持する必要はありません。追加のボーナスとして、アプリケーションが間違ってまたは間違って設定することもできません(これは、SQLで一般的で許容されるトリガーの使用です)。

+0

ありがとう、ありがとう。ありがとうございました。 – frans

1

新しい列がマンダントでない場合は、何も心配する必要はありません。カラムリストの代わりに "*"を持つselect文を書いたナックルヘッドを持っていない限り。

+0

このようなクエリが存在する可能性があります。アプリは巨大です。 – frans

+2

または 'INSERT INTO dbo.Table VALUES(.....)'を書いて、使用する列のリストを指定していない他のナックルヘッド - これらの挿入は**新しい列を追加すると**すべてのブレーク** - 必須そうではありません.... –

1

あなたのSELECTが*でなければ、それらはうまくいくはずです。 INSERTの場合、フィールドにデフォルトのGETDATE()を与えてNULLを許可すると、それを除外することができます。

1

他のクエリの設定方法によって異なります。彼らがSELECT [Item1], [Item2], ectの場合....あなたは何の問題に直面することはありません。 SELECT * FROMの場合、予期しない結果が生じることがあります。

設定方法を覚えておいてください。あなたが道路に合ったものになる可能性のあるヌル値に設定するか、デフォルトの日付を設定する必要があります。

+0

それは確かに考慮すべきものです。これを報告することを検討する。ありがとうございました。 – frans

関連する問題