はい、既存テーブルにもSCD Type2モードで転送することは可能です。
ただし、SCD Type2の仕様に沿ったテーブル構造になっている必要があります。
必要なテーブル構成
SCD Type2では、履歴管理のために以下のカラムが必要になります。
カラム名 | 型 | 説明 |
|---|---|---|
| TIMESTAMP | 有効開始日時 |
| TIMESTAMP | 有効終了日時(NULL=現在有効) |
| BOOLEAN | キーカラムにおける最新のレコードを示すフラグ |
こちらの3カラムが存在しない場合は、事前に追加しておく必要があります。
上記のカラムが存在していないテーブルに対して転送を実行すると、以下のエラーが発生します。
Google::Apis::ClientError invalidQuery: Query error: Name trocco_is_current not found inside t補足
前提として、増分基準カラムが更新されている場合に、更新された有効なレコードが追加される仕様です。
① 有効開始日時(trocco_valid_from)がNULLだった場合
NULLであっても、増分基準カラムの値に変化があった場合には、レコードが追加されます。以下が既存テーブルです。
| id | address | created_at | updated_at | trocco_valid_from | trocco_valid_to | trocco_is_current | |
|---|---|---|---|---|---|---|---|
| u_001 | user1@example.com | 神奈川県 | 2026-02-01 10:00:00 UTC | 2026-02-01 10:00:00 UTC | null | null | true |
| u_002 | user2@example.com | 兵庫県 | 2026-02-01 10:00:00 UTC | 2026-02-01 10:00:00 UTC | null | null | true |
| u_003 | user3@example.com | 福岡県 | 2026-02-01 10:00:00 UTC | 2026-02-01 10:00:00 UTC | null | null | true |
id=u_002で住所の変更(兵庫県→大阪府)があり、updated_atの更新があった場合は、以下のようになります。
| id | address | created_at | updated_at | trocco_valid_from | trocco_valid_to | trocco_is_current | |
|---|---|---|---|---|---|---|---|
| u_001 | user1@example.com | 神奈川県 | 2026-02-01 10:00:00 UTC | 2026-02-01 10:00:00 UTC | null | null | true |
| u_002 | user2@example.com | 兵庫県 | 2026-02-01 10:00:00 UTC | 2026-02-01 10:00:00 UTC | null | 2026-02-16 11:00:00 UTC | false |
| u_003 | user3@example.com | 福岡県 | 2026-02-01 10:00:00 UTC | 2026-02-01 10:00:00 UTC | null | null | true |
| u_002 | user2@example.com | 大阪府 | 2026-02-01 10:00:00 UTC | 2026-02-16 10:00:00 UTC | 2026-02-16 11:00:00 UTC | null | true |
② 同一キーカラムで「現在レコード」が複数存在する(= trocco_is_currentがtrueのレコードが複数ある)場合
以下のようなid=u_003のレコードが重複しており、trocco_is_current がどちらもtrueだった場合を例とします。
| id | address | created_at | updated_at | trocco_valid_from | trocco_valid_to | trocco_is_current | |
|---|---|---|---|---|---|---|---|
| u_001 | user1@example.com | 神奈川県 | 2026-02-01 10:00:00 UTC | 2026-02-01 10:00:00 UTC | 2026-02-10 11:00:00 UTC | null | true |
| u_002 | user2@example.com | 兵庫県 | 2026-02-01 10:00:00 UTC | 2026-02-01 10:00:00 UTC | 2026-02-10 11:00:00 UTC | null | true |
| u_003 | user3@example.com | 福岡県 | 2026-02-01 10:00:00 UTC | 2026-02-01 10:00:00 UTC | 2026-02-10 11:00:00 UTC | null | true |
| u_003 | user3@example.com | 長崎県 | 2026-02-10 00:00:00 UTC | 2026-02-10 00:00:00 UTC | 2026-02-10 11:00:00 UTC | null | true |
この場合は、既存のレコードは全て無効になり、新規レコードが追加されました。
| id | address | created_at | updated_at | trocco_valid_from | trocco_valid_to | trocco_is_current | |
|---|---|---|---|---|---|---|---|
| u_001 | user1@example.com | 神奈川県 | 2026-02-01 10:00:00 UTC | 2026-02-01 10:00:00 UTC | 2026-02-10 11:00:00 UTC | null | true |
| u_002 | user2@example.com | 兵庫県 | 2026-02-01 10:00:00 UTC | 2026-02-01 10:00:00 UTC | 2026-02-10 11:00:00 UTC | null | true |
| u_003 | user3@example.com | 福岡県 | 2026-02-01 10:00:00 UTC | 2026-02-01 10:00:00 UTC | 2026-02-10 11:00:00 UTC | 2026-02-15 18:30:00 UTC | false |
| u_003 | user3@example.com | 長崎県 | 2026-02-10 00:00:00 UTC | 2026-02-10 00:00:00 UTC | 2026-02-10 11:00:00 UTC | 2026-02-15 18:30:00 UTC | false |
| u_003 | user3@example.com | 佐賀県 | 2026-02-10 00:00:00 UTC | 2026-02-15 18:00:00 UTC | 2026-02-15 18:30:00 UTC | null | true |
コメント
0件のコメント
記事コメントは受け付けていません。