データベース更新パターン仕様書
論理削除パターンの適用範囲
この論理削除パターンは以下のマスタテーブルに適用されます: - 送信パターン (SendPatterns) - 顧客マスタ (CustomerMaster)
データ更新仕様
変更内容
マスタデータの更新方法が以下のように変更されました:
従来の方法
- 物理削除(DELETE)してから新規登録(INSERT)
新しい方法
- 論理削除: 既存レコードをUPDATEで未使用フラグ(UnusedFlag = 1)に設定
- 新規登録: 新しいレコードをINSERTで追加
実装例
1. 送信パターン (SendPatterns)
-- Step 1: 既存レコードを論理削除(未使用に設定)
UPDATE SendPatterns
SET UnusedFlag = 1,
UpdatedAt = GETDATE()
WHERE PatternId = @PatternId
AND UnusedFlag = 0;
-- Step 2: 新しいレコードを挿入
INSERT INTO SendPatterns (
PatternId,
PatternName,
Description,
UnusedFlag,
CreatedAt,
UpdatedAt
) VALUES (
@NewPatternId,
@PatternName,
@Description,
0, -- 使用中
GETDATE(),
GETDATE()
);
2. 顧客マスタ (CustomerMaster)
-- Step 1: 既存レコードを論理削除(未使用に設定)
UPDATE CustomerMaster
SET UnusedFlag = 1,
UpdatedAt = GETDATE()
WHERE CustomerId = @CustomerId
AND UnusedFlag = 0;
-- Step 2: 新しいレコードを挿入
INSERT INTO CustomerMaster (
CustomerId,
CustomerName,
CustomerCode,
Email,
UnusedFlag,
CreatedAt,
UpdatedAt
) VALUES (
@NewCustomerId,
@CustomerName,
@CustomerCode,
@Email,
0, -- 使用中
GETDATE(),
GETDATE()
);
テーブル構造の変更
-- SendPatternsテーブルに未使用フラグカラムを追加
ALTER TABLE SendPatterns
ADD UnusedFlag BIT NOT NULL DEFAULT 0;
-- CustomerMasterテーブルに未使用フラグカラムを追加
ALTER TABLE CustomerMaster
ADD UnusedFlag BIT NOT NULL DEFAULT 0;
-- インデックスの追加(パフォーマンス向上のため)
CREATE INDEX IX_SendPatterns_UnusedFlag
ON SendPatterns(UnusedFlag);
CREATE INDEX IX_CustomerMaster_UnusedFlag
ON CustomerMaster(UnusedFlag);
メリット
- データの履歴保持: 過去のパターンデータが残るため、監査やトラブルシューティングが容易
- 参照整合性の維持: 他のテーブルから参照されているデータを安全に無効化できる
- 復元可能性: 誤って削除した場合でも、フラグを戻すだけで復元可能
注意事項
- すべてのSELECTクエリに
WHERE UnusedFlag = 0
の条件を追加する必要がある - 定期的に古い論理削除データを物理削除するバッチ処理の検討が必要
関連するDAO/DTOの変更
1. SendPattern関連
DAO (Data Access Object)
public List<SendPatternDto> GetActivePatterns()
{
string sql = @"
SELECT * FROM SendPatterns
WHERE UnusedFlag = 0
ORDER BY PatternName";
// 実装...
}
public void LogicalDelete(string patternId)
{
string sql = @"
UPDATE SendPatterns
SET UnusedFlag = 1, UpdatedAt = GETDATE()
WHERE PatternId = @PatternId";
// 実装...
}
DTO (Data Transfer Object)
public class SendPatternDto
{
public string PatternId { get; set; }
public string PatternName { get; set; }
public string Description { get; set; }
public bool UnusedFlag { get; set; } // 追加
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
}
2. CustomerMaster関連
DAO (Data Access Object)
public List<CustomerMasterDto> GetActiveCustomers()
{
string sql = @"
SELECT * FROM CustomerMaster
WHERE UnusedFlag = 0
ORDER BY CustomerName";
// 実装...
}
public void LogicalDelete(string customerId)
{
string sql = @"
UPDATE CustomerMaster
SET UnusedFlag = 1, UpdatedAt = GETDATE()
WHERE CustomerId = @CustomerId";
// 実装...
}
DTO (Data Transfer Object)
public class CustomerMasterDto
{
public string CustomerId { get; set; }
public string CustomerName { get; set; }
public string CustomerCode { get; set; }
public string Email { get; set; }
public bool UnusedFlag { get; set; } // 追加
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
}
更新日
- 2024年7月25日: 初版作成