使用外部索引鍵設定刪除行為
當刪除外部索引鍵關係任一側的實體時,必須指定關係另一側的實體將發生什麼情況。如此可確保維持參考性完整,並遵循任何依據商業邏輯的決定。
刪除行為在資料形式的資料庫資訊中指定,其位於用來指定外部索引鍵的相同陣列中。會針對每個個別外部索引鍵指定刪除行為 (如果有)。若需進一步資訊,可參閱
新增或移除外部索引鍵。
在下列說明中,A 是具有外部索引鍵的實體,B 是具有外部索引鍵所參考之欄位的實體。
• onDelete - 可決定若將 B 刪除,A 會發生的情況。
◦ CASCADE - 若刪除 B,也會刪除 A。這稱為串聯刪除。
◦ SET_NULL - 若刪除 B,A 的外部索引鍵欄位值會設定為空值。
◦ 若未指定 onDelete,則當刪除 B 時,A 不會發生任何情況。
• deleteReference - 可決定若將 A 刪除,B 會發生的情況。
◦ 若設定為 true,當刪除 A 時,也會刪除 B。
◦ 若設定為 false 或未指定,則當刪除 A 時,B 不會發生任何情況。
|
當使用 串聯刪除服務刪除實體時,服務中的 deleteReference 輸入參數會決定是否遵循實體之資料庫資訊中的 deleteReference 設定。將 deleteReference 輸入參數設定為 true 時,會刪除 deleteReference 設定為 true 之外部索引鍵所參考的全部實體。將 deleteReference 輸入參數設定為 false 時,不會刪除參考的實體。
|
例如,重複曆日 (PTC.Shift.CalendarDayRepeating) 是行事曆與班次時間表之間的關係。這是在重複曆日上以參考行事曆的 UID (CalendarUID) 及班次時間表 (ShiftScheduleUID) 的外部索引鍵欄位所定義。下列程式碼來自為重複曆日資料形式 (PTC.Shift.CalendarDayRepeating) 指定的資料庫資訊,該資料形式位於 PTC.ShiftImpl.Manager 物件的 GetDBInfo 服務中。
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"
}]
由於針對 calendarUid 外部索引鍵將 onDelete 設定為了 CASCADE,因此如果刪除所參考的行事曆,也會同時刪除重複的曆日。這樣可確保參考的完整性;除非存在行事曆,否則不可能存在重複的曆日。
由於針對 shiftScheduleUid 欄位中的外部索引鍵將 deleteReference 設定了為 true,因此如果刪除重複曆日,也會刪除 shiftScheduleUid 欄位所參考的班次排程。此行為由企業決策所決定,該決策指定了如果刪除重複曆日,則也應刪除與其相關的班次排程。
|
在 與資料庫同步處理之前,不需要指定刪除行為,即可將新資料形式或外部索引鍵新增至資料庫結構描述。最佳作法是,應在刪除外部索引鍵關係任一側之資料形式的任何實例之前指定刪除行為。
|
刪除服務與外部索引鍵刪除行為
用來執行刪除,同時符合每個外部索引鍵
onDelete 與
deleteReference 設定的服務可在資料庫管理物形式中找到 (
PTC.DBConnection.DBManagementThingShape)。這些串聯刪除服務包括:
BatchCascadeDelete、
CascadeDelete 與
CollectActionForCascadeDelete。所有管理員都會從此物形式延伸,因此它們會繼承這些服務。如需詳細資訊,請參閱
資料庫管理物形式服務。
個別資料模型物件的標準刪除動作 (例如 DeleteShift 或 DeleteJobOrder) 只會刪除指定實體。如果僅刪除該實體違反參考完整性,則服務失敗。在上述情況下,請使用串聯刪除服務。這有一個例外,就是呼叫 CascadeDeleteModel 服務的 PTC.MfgModelImpl.Manager 物件中的 DeleteSite 服務。