外部キーによる削除動作の設定
外部キー関係の一方の側のエンティティが削除される際、関係の反対側のエンティティの動作を指定する必要があります。これにより、参照整合性が維持され、ビジネスロジックに基づく任意の決定に従います。
削除動作は、データシェイプ用のデータベース情報で指定され、外部キーが指定されるのと同じ配列で指定されます。削除動作 (存在する場合) は、個々の外部キーごとに指定されます。詳細については、外部キーの追加または除去を参照してください。
次の説明では、A は外部キーを持つエンティティであり、B は外部キーによって参照されるフィールドを持つエンティティです。
onDelete - B が削除されるときの、A の動作を決定します。
CASCADE - B が削除されると A も削除されます。これはカスケード削除と呼ばれます。
SET_NULL - B が削除されるときに、A の外部キーフィールドの値は Null に設定されます。
onDelete が指定されていない場合、B が削除されても A には何も起こりません。
deleteReference - A が削除されるときの、B の動作を決定します。
true の場合、A が削除されると B も削除されます。
false の場合または指定されていない場合、A が削除されても B には何も起こりません。
* 
カスケード削除サービスを使用してエンティティを削除すると、サービスでの deleteReference 入力パラメータによって、エンティティに関するデータベース情報内の deleteReference 設定に従うかどうかが決まります。deleteReference 入力パラメータが true に設定されている場合、deleteReference 設定が true である外部キーによって参照されるすべてのエンティティが削除されます。deleteReference 入力パラメータが false に設定されている場合、参照されるエンティティは削除されません。
たとえば、繰り返しカレンダー日 (PTC.Shift.CalendarDayRepeating) は、カレンダーとシフトスケジュールの関係です。これは、カレンダー (CalendarUID) の UID とシフトスケジュール (ShiftScheduleUID) の UID を参照する外部キーフィールドで、繰り返しカレンダー日に定義されます。次のコードは、PTC.ShiftImpl.Manager Thing 上の GetDBInfo サービスで、繰り返しカレンダー日データシェイプ (PTC.Shift.CalendarDayRepeating) 用に指定されたデータベース情報からのものです。
foreignKeys: [{
name: "calendarUid",
referenceDataShapeName: "PTC.Shift.Calendar",
referenceFieldName: "uid",
onDelete: "CASCADE"
}, {
name: "shiftScheduleUid",
referenceDataShapeName: "PTC.Shift.ShiftSchedule",
referenceFieldName: "uid",
deleteReference: true
}, {
name: "siteUid",
referenceDataShapeName: "PTC.MfgModel.Site",
referenceFieldName: "uid"
}]
onDeletecalendarUid 外部キーに対して CASCADE に設定されているため、参照されるカレンダーが削除されると、繰り返しカレンダー日も削除されます。これにより、参照整合性が確保されます。カレンダーが存在しない限り、繰り返しカレンダー日は存在できません。
shiftScheduleUid フィールドで外部キーに対して deleteReference が true に設定されているため、繰り返しカレンダー日が削除されると、shiftScheduleUid フィールドによって参照されるシフトスケジュールも削除されます。この動作はビジネス上の意思決定によって決定され、繰り返しカレンダー日が削除される場合に、それに関連するシフトスケジュールを削除する必要があることを指定します。
* 
データベーススキーマに新規データシェイプまたは外部キーを追加するには、データベースと同期化する前に、削除動作を指定する必要はありません。最良事例として、外部キー関係の一方の側でデータシェイプのインスタンスが削除される前に、削除動作を指定する必要があります。
削除サービスと外部キー削除の動作
各外部キーに対する onDeletedeleteReference の設定を満たす一方で、削除を行うために使用されるサービスは、データベース管理 Thing Shape (PTC.DBConnection.DBManagementThingShape) にあります。これらのカスケード削除サービスは、BatchCascadeDeleteCascadeDelete、および CollectActionForCascadeDelete です。すべてのマネージャはこの Thing Shape から拡張するため、これらのサービスを継承します。詳細については、データベース管理 Thing Shape のサービスを参照してください。
DeleteShiftDeleteJobOrder などの、個々のデータモデルオブジェクトに対する標準の削除操作は、指定されたエンティティのみを削除します。そのエンティティのみを削除することで参照整合性に違反すると、そのサービスは失敗します。そのような場合は、カスケード削除サービスを使用します。この例外は、CascadeDeleteModel サービスを呼び出す PTC.MfgModelImpl.Manager Thing 上の DeleteSite サービスです。
これは役に立ちましたか?