0

CDC の使用は許可されていません。

テーブルに加えられた変更を次の形式で報告する必要があります。

[この日付] に、ユーザー [UserName] がフィールド [FieldName] を [OldValue] から [New Value] に変更しました

私の考えは、テーブルで Update/Insert トリガーを使用し、それを TableA と呼び、行を同じ列を持つ新しい TableA_Tracking tablem とソース テーブルへの外部キーに書き込むことです。

TableA には列'LastUpdatedByUserId'だけでなく a もあり'LastUpdateDate'ます。

トリガーによるデータの保存はOKです。ただし、アプリケーションに報告できるように、データを取り戻す効率的な方法があるかどうか疑問に思っています。

データをテーブル形式に抽出し、それを UI に返して書式設定するために従うことができるパターンはありますか?

私は次のようなことを考えています:

WITH Track_CTE (
  Placement_TrackID, 
  PlacementId, 
  PlacementEventId, 
  CarerId,
  FosterCareAllowanceFlag,
  InterstateAllowanceAmount,
  FosterCareAllowanceReason,
  FosterCareAllowanceDate,
  InterstateAllowanceFlag,
  LastUpdateUser,
  LastUpdateDate
)
AS
(
  SELECT 
    Placement_TrackID, 
    PlacementId, 
    PlacementEventId, 
    CarerId,
    FosterCareAllowanceFlag,
    InterstateAllowanceAmount,
    FosterCareAllowanceReason,
    FosterCareAllowanceDate,
    InterstateAllowanceFlag,
    LastUpdateUser,
    LastUpdateDate
  FROM       
    [Placement_Track]
)
SELECT    *

FROM   Track_CTE c1
LEFT JOIN Track_CTE c2
ON c2.Placement_TrackID = c1.Placement_TrackID - 1

Placement_Track は、PK (最初の列) を除いて、ソース テーブルの直接コピーであるテーブルです。テーブルは、更新および挿入のトリガーによって書き込まれます。

これには、更新されたバージョンと以前のバージョンの行があります...そして、そこから、おそらく変更を解決しますか? しかし、私は道を外れているかもしれません。

上記の例では、ソース テーブルの PK である PlacementId でフィルター処理を行い、選択がより制限されるようにします。また、この例で追跡している列は、FosterCareAllowanceFlag、InterstateAllowanceAmount、FosterCareAllowanceReason、FosterCareAllowanceDate、および InterstateAllowanceFlag だけです。

4

1 に答える 1

0

テーブルの行が変更されるたびに、システム一時テーブル ##deleted のトリガー内で古いデータが使用可能になり、テーブル ##inserted から新しいデータが使用可能になります。

したがって、テーブル X (id int、col1 varchar(5)、col2 varchar(100)) に次が含まれている場合:

id = 1、col1 = 'Code'、col2 = 'Description' の場合、このデータは次の方法で更新されます。

UPDATE X set col2 = 'Description' WHERE id = 1;

テーブル ## 削除されたものには id = 1、col1 = 'コード'、col2 = '説明' が含まれます テーブル ## 挿入されたものには id = 1、col1 = 'コード'、col2 = '説明' が含まれます

INFORMATION_SCHEMA.COLUMNS を使用して、(テーブルの名前がトリガー内の変数で定義されている場合) テーブルの合計にいくつの列があるかを把握できます。この情報があれば、列をループしても問題ありません。 ##deleted と ##inserted を比較して、必要な監査データを生成します。

于 2013-09-18T04:15:01.117 に答える