轉換規則與動作 - AWS Database Migration Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

轉換規則與動作

您可以使用轉換動作指定您希望套用到所選取結構描述或資料表的任何轉換。轉換規則為選擇性。

限制

  • 您無法對同一個物件 (結構描述、資料表、資料欄、資料表空間或索引資料表空間) 套用一個以上的轉換規則動作。但只要每個轉換動作都套用至不同的物件,您就可以在任意層級上套用數個轉換規則動作。

  • 轉換規則中的資料表名稱和資料欄名稱會區分大小寫。例如,您必須以大寫提供 Oracle 或 Db2 資料庫的資料表名稱和資料欄名稱。

  • 使用由右至左語言的資料欄名稱不支援轉換。

  • 名稱中包含特殊字元 (例如 #,\,/,-) 的資料欄無法執行轉換。

  • 對於映射至 BLOB/CLOB 資料類型的資料欄,唯一支援的轉換方式是將資料欄放置在目標上。

  • AWS DMS 不支援將兩個來源資料表複製到單一目標資料表。 AWS DMS 根據複寫任務的轉換規則,將記錄從資料表複製到資料表,以及從資料行複寫記錄到資料行。物件名稱必須是唯一名稱以防止重疊。

    例如,來源資料表有一個名為 ID 的資料欄,而映射目標資料表已存在名為 id 的資料欄。如果規則使用 ADD-COLUMN 陳述式新增名為 id 的新資料欄,並使用 SQLite 陳述式將自訂值填入資料欄,則會建立名為 id 的重複、不明確物件,且不受支援。

針對使用轉換規則類型的資料表映射規則,可套用下列值。

參數 可能的值 描述
rule-type transformation 此值將規則套用到選擇規則所指定的各物件。除非另有說明,否則使用 transformation
rule-id 數值。 識別規則的唯一數值。如果您為相同物件 (綱要、資料表、資料欄、資料表間空間或索引表格空間) 指定多個轉換規則,則會 AWS DMS 套用規則識別碼較低的轉換規則。
rule-name 英數值。 識別規則的唯一名稱。
object-locator 具有下列參數的物件:
  • schema-name – 結構描述的名稱。對於 MongoDB 和 Amazon DocumentDB 端點,這是包含一組集合的資料庫名稱。

  • table-name – 資料表或檢視的名稱。

  • table-tablespace-name – 現有資料表資料表空間的名稱。

  • index-tablespace-name – 現有索引資料表空間的名稱。

  • column-name – 現有資料欄的名稱。

  • data-type – 現有欄資料類型的名稱。

每個要套用規則之結構描述、資料表或檢視、資料表資料表空間、索引資料表空間和資料行的名稱。您可以使用 "%" 百分比符號做為萬用字元,以代表每個 object-locator 參數的所有值或部分值,除了 data-type 以外。因此,您可以符合這些項目:

  • 單一結構描述中的單一資料表或檢視

  • 部分或所有結構描述中的單一資料表或檢視

  • 單一結構描述中的部分或全部資料表和檢視

  • 部分或所有結構描述中的部分或全部資料表和檢視

  • 指定一或多個資料表、一或多個檢視和一或多個結構描述中的一或多個欄。

  • 在指定了多個欄時,具有指定 data-type 的欄。如需 data-type 的可能值,請參閱以下在此資料表中所述的 data-type

此外,table-tablespace-nameindex-tablespace-name 參數僅適用於匹配 Oracle 來源端點。在單一規則中,您可以指定 table-tablespace-nameindex-tablespace-name,但不能同時指定兩者。因此,您可以比對下列任一項目:

  • 一個、幾個或所有資料表資料表空間

  • 一個、幾個或所有索引資料表空間

rule-action

add-column, include-column, remove-column

rename

convert-lowercase, convert-uppercase

add-prefix, remove-prefix, replace-prefix

add-suffix, remove-suffix, replace-suffix

define-primary-key

change-data-type

add-before-image-columns

您希望套用到物件的轉換。所有轉換規則動作都區分大小寫。

rule-action 參數的 add-column 值會將欄新增至資料表。但是您新增的資料欄其名稱不可與相同資料表的現有資料欄重複。

在與 expressiondata-type 參數搭配使用時,add-column 會指定新欄資料的值。

rule-actionchange-data-type 值僅適用於 column 規則目標。

rule-action 參數的 include-column 值將資料表的模式並更為依預設刪除所有資料欄,並包含指定的資料欄。若多次呼叫 include-column 規則,將會在目標中包含多個資料欄。

如果 define-primary-key 規則在結構描述或資料表名稱中包含萬用字元 (%),則無法使用該規則。

對於現有任務而言,更改目標資料表結構描述 (例如 remove-columnrenameadd-prefix) 的轉換規則動作必須等到重新啟動任務後才會生效。如果您在新增轉換規則後繼續執行任務,可能會發現更改的資料欄的非預期行為,其中可能包括遺失的資料欄資料。需要重新啟動任務,才能確保轉換規則的正常運作。

rule-target schema, table, column, table-tablespace, index-tablespace 您要轉換的物件類型。

table-tablespaceindex-tablespace 值僅適用於 Oracle 目標端點。

請務必為做為 object-locator: table-tablespace-nameindex-tablespace-name 名稱一部分的參數指定一個值。

value 遵循目標類型命名規則的英數值。 需要輸入動作的新值,例如 rename
old-value 遵循目標類型命名規則的英數值。 需要取代動作的舊值,例如 replace-prefix
data-type

typerule-action 要使用的資料類型 (若 add-columnrule-action),或取代資料類型 (若 為 change-data-type)。

或者,取代資料類型的名稱 (在 rule-actionchange-data-type 時)、column-name 的值為 "%",以及可識別 object-locator 中所包含的現有資料類型的額外 data-type 參數。

AWS DMS 支援下列 DMS 資料類型的資料行資料類型轉換:"bytes", "date", "time", "datetime", "int1", "int2", "int4", "int8", "numeric", "real4", "real8", "string", "uint1", "uint2", "uint4", "uint8", "wstring", "blob", "nclob", "clob", "boolean", "set", "list" "map", "tuple"

precision – 如果新增的欄或取代資料類型具有精確度,則以整數值指定精確度。

scale – 如果新增的欄或取代資料類型具有小數位數,則以整數值或日期時間值來指定小數位數。

length – 新欄資料的長度 (在與 add-column 搭配使用時)

以下為 data-type 參數的範例,指定要取代的現有資料類型。

{ "rules": [{ "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "%", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-target": "column", "object-locator": { "schema-name": "test", "table-name": "table_t", "column-name": "col10" }, "rule-action": "change-data-type", "data-type": { "type": "string", "length": "4092", "scale": "" } } ] }

在這裡,table_t 資料表的 col10 資料欄已變更為 string 資料類型。

expression 遵循 SQLite 語法的英數值。

與設為 rename-schemarule-action 搭配使用時,expression 參數會指定新的結構描述。與設為 rename-tablerule-action 搭配使用時,expression 會指定新的資料表。與設為 rename-columnrule-action 搭配使用時,expression 會指定新的欄名稱值。

與設為 add-columnrule-action 搭配使用時,expression 會指定構成新欄的資料。

請注意,此參數只支援表達式。不支援運算子和命令。

如需如何將表達式用於轉換規則的詳細資訊,請參閱:使用轉換規則表達式定義資料行內容

如需 SQLite 表達式的詳細資訊,請參閱:使用 SQLite 函數來建構表達式

primary-key-def

具有下列參數的物件:

  • name – 資料表或檢視的新主索引鍵或唯一索引的名稱。

  • (選用) origin – 要定義的唯一索引鍵類型:primary-key (預設) 或 unique-index

  • columns – 字串陣列,其中以出現在主索引鍵或唯一索引中的順序列出欄名稱。

此參數可以定義所轉換資料表或檢視上唯一索引鍵的名稱、類型和內容。它在 rule-action 設為 define-primary-keyrule-target 設為 table 時也會這麼做。預設情況下,唯一索引鍵定義為主索引鍵。
before-image-def

具有下列參數的物件:

  • column-prefix – 附加至欄名稱前的值。預設值為 BI_

  • column-suffix – 附加至欄名稱的值。預設值為空白。

  • column-filterpk-only 需要下列其中一個值:non-lob (預設值)、 (選用) 和 all (選用)。

此參數會定義可識別前映像欄的命名慣例,並指定篩選條件以識別哪些來源欄可具有在目標上為其建立的前映像欄。您可以在 rule-action 設為 add-before-image-columnsrule-target 設為 column 時指定此參數。

請勿將 column-prefixcolumn-suffix 同時設為空白字串。

針對 column-filter,請選取:

  • pk-only – 僅新增屬於資料表主索引鍵一部分的欄。

  • non-lob – 僅新增不屬於 LOB 類型的欄。

  • all – 新增任何具有前映像值的欄。

如需 AWS DMS 目標端點的前映像支援的詳細資訊,請參閱:

範例

範例 重新命名結構描述

以下範例會將您來源中的結構描述,從 Test 重新命名為目標中的 Test1

{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "Test", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "rename", "rule-target": "schema", "object-locator": { "schema-name": "Test" }, "value": "Test1" } ] }
範例 重新命名資料表

以下範例會將您來源中的資料表,從 Actor 重新命名為目標中的 Actor1

{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "Test", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "rename", "rule-target": "table", "object-locator": { "schema-name": "Test", "table-name": "Actor" }, "value": "Actor1" } ] }
範例 重新命名欄位

以下範例會將您來源中 Actor 資料表內的資料行,從 first_name 重新命名為目標中的 fname

{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "test", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "transformation", "rule-id": "4", "rule-name": "4", "rule-action": "rename", "rule-target": "column", "object-locator": { "schema-name": "test", "table-name": "Actor", "column-name" : "first_name" }, "value": "fname" } ] }
範例 重新命名 Oracle 資料表資料表空間

以下範例針對 Oracle 來源中名為 Actor 的資料表,將名為 SetSpace 的資料表之資料表空間重新命名為 Oracle 目標端點中的 SceneTblSpace

{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "Play", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "rename", "rule-target": "table-tablespace", "object-locator": { "schema-name": "Play", "table-name": "Actor", "table-tablespace-name": "SetSpace" }, "value": "SceneTblSpace" } ] }
範例 重新命名 Oracle 索引資料表空間

以下範例針對 Oracle 來源中名為 Actor 的資料表,將名為 SetISpace 的索引資料表空間重新命名為 Oracle 目標端點中的 SceneIdxSpace

{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "Play", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "rename", "rule-target": "table-tablespace", "object-locator": { "schema-name": "Play", "table-name": "Actor", "table-tablespace-name": "SetISpace" }, "value": "SceneIdxSpace" } ] }
範例 新增資料行

下列範例會將 datetime 欄新增至結構描述 test 中的資料表 Actor

{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "test", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "add-column", "rule-target": "column", "object-locator": { "schema-name": "test", "table-name": "actor" }, "value": "last_updated", "data-type": { "type": "datetime", "precision": 6 } } ] }
範例 移除資料行

以下範例會轉換您來源中名為 Actor 的資料表,在您的目標中移除所有開頭為 col 字元的資料行。

{ "rules": [{ "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "test", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "remove-column", "rule-target": "column", "object-locator": { "schema-name": "test", "table-name": "Actor", "column-name": "col%" } }] }
範例 轉換成小寫

以下範例會將資料表名稱從來源中的 ACTOR 轉換為目標中的 actor

{ "rules": [{ "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "test", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "convert-lowercase", "rule-target": "table", "object-locator": { "schema-name": "test", "table-name": "ACTOR" } }] }
範例 轉換成大寫

以下範例會將您來源中所有資料表及結構描述中的所有資料行,從小寫轉換為目標中的大寫。

{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "test", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "convert-uppercase", "rule-target": "column", "object-locator": { "schema-name": "%", "table-name": "%", "column-name": "%" } } ] }
範例 新增前綴

以下範例會轉換您來源中所有的資料表,在目標中新增前綴 DMS_

{ "rules": [{ "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "test", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "add-prefix", "rule-target": "table", "object-locator": { "schema-name": "test", "table-name": "%" }, "value": "DMS_" }] }
範例 取代前綴

以下範例會轉換您來源中所有包含前綴 Pre_ 的資料行,在目標中將其取代成 NewPre_

{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "test", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "replace-prefix", "rule-target": "column", "object-locator": { "schema-name": "%", "table-name": "%", "column-name": "%" }, "value": "NewPre_", "old-value": "Pre_" } ] }
範例 移除後綴

以下範例會轉換您來源中所有的資料表,在目標中移除後綴 _DMS

{ "rules": [{ "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "test", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "remove-suffix", "rule-target": "table", "object-locator": { "schema-name": "test", "table-name": "%" }, "value": "_DMS" }] }
範例 定義主索引鍵

以下範例在遷移到目標端點的 ITEM 資料表的三個欄上,定義名為 ITEM-primary-key 的主索引鍵。

{ "rules": [{ "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "inventory", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "define-primary-key", "rule-target": "table", "object-locator": { "schema-name": "inventory", "table-name": "ITEM" }, "primary-key-def": { "name": "ITEM-primary-key", "columns": [ "ITEM-NAME", "BOM-MODEL-NUM", "BOM-PART-NUM" ] } }] }
範例 定義唯一索引

以下範例在遷移到目標端點的 ITEM 資料表的三個欄上,定義名為 ITEM-unique-idx 的唯一索引。

{ "rules": [{ "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "inventory", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "define-primary-key", "rule-target": "table", "object-locator": { "schema-name": "inventory", "table-name": "ITEM" }, "primary-key-def": { "name": "ITEM-unique-idx", "origin": "unique-index", "columns": [ "ITEM-NAME", "BOM-MODEL-NUM", "BOM-PART-NUM" ] } }] }
範例 變更目標資料行的資料類型

下列範例會將名為 SALE_AMOUNT 之目標資料行的資料類型,從現有的資料類型變更為 int8

{ "rule-type": "transformation", "rule-id": "1", "rule-name": "RuleName 1", "rule-action": "change-data-type", "rule-target": "column", "object-locator": { "schema-name": "dbo", "table-name": "dms", "column-name": "SALE_AMOUNT" }, "data-type": { "type": "int8" } }
範例 新增前映像資料行

針對名為 emp_no 的來源欄,下列範例中的轉換規則會在目標中新增名為 BI_emp_no 的新欄。

{ "rules": [{ "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "%", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-target": "column", "object-locator": { "schema-name": "%", "table-name": "employees" }, "rule-action": "add-before-image-columns", "before-image-def": { "column-prefix": "BI_", "column-suffix": "", "column-filter": "pk-only" } } ] }

在此,下列陳述式會在對應的資料列中為 BI_emp_no 欄填入 1。

UPDATE employees SET emp_no = 3 WHERE BI_emp_no = 1;

將 CDC 更新寫入支援的 AWS DMS 目標時,資BI_emp_no料行可讓您判斷哪些資料列已更新資料行中的emp_no值。