6

SQL Server に既存のエントリを持つ既存のテーブルがあります (実際には 100 万以上)。

このテーブルは、フロントエンド アプリケーションによって定期的に更新、挿入、および選択されます。次のように更新できるdatetime列を追加したい/追加する必要があります。M_DateModified

UPDATE Table SET M_DateModified = GETDATE()

フロントエンドでボタンが押され、ストアド プロシージャが呼び出されるたびに。この列は、要求に応じて既存のレポートに追加されます。

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

この問題に関する最善の解決策について、どんな助けも大歓迎です。

4

4 に答える 4

6

まず、marc_s が言うように、SELECT *クエリにのみ影響する必要があり、必ずしもすべてのクエリに影響するわけではありません。

第 2 に、で Null 以外のすべてのフィールドを指定するだけでよいためINSERT、NULL を許容するようにすれば、それについて心配する必要はありません。さらに、Created_Date-type 列の場合は、 のDEFAULT設定を追加するのが一般的=GetDate()です。これは、指定されていない場合に自動的に入力されます。

第三に、既存のコードベースへの影響がまだ心配な場合は、次のことを行います。

  1. テーブルの名前を「physicalTable」などに変更します。
  2. テーブルが以前持っていたのと同じ名前でビューを作成します。これは、列を明示的に同じ順序でリストしますが、フィールドSELECT .. FROM physicalTableは含めません。M_DateModified
  3. テーブルに直接アクセスするのではなく、ビューを参照するコードを変更せずに残します。

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

最後に、この種の "ModifiedDate" 列は一般的なニーズであり、ほとんどの場合、最初に NULL 可能にしてから、自動的に設定する Insert & Update トリガーを追加することで処理されます。

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

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

于 2013-08-12T13:52:06.993 に答える