Building block > Building block comuni > Building block di connessione database > Attività del database > Impostazione del comportamento di eliminazione con chiavi esterne
Impostazione del comportamento di eliminazione con chiavi esterne
Quando l'entità su un lato di una relazione di chiave esterna viene eliminata, è necessario specificare ciò che accade all'entità sull'altro lato della relazione. Ciò garantisce che l'integrità dei riferimenti venga mantenuta e che qualsiasi decisione basata sulla logica aziendale venga seguita.
Il comportamento di eliminazione viene specificato nelle informazioni del database per una data shape, nella stessa matrice in cui sono specificate le chiavi esterne. Il comportamento di eliminazione, se disponibile, è specificato per ogni singola chiave esterna. Per ulteriori informazioni, vedere Aggiunta o rimozione di chiavi esterne.
Nelle descrizioni riportate di seguito, A è l'entità con la chiave esterna e B è l'entità con il campo referenziato dalla chiave esterna.
onDelete - Determina cosa accade ad A quando viene eliminata B.
CASCADE - Quando viene eliminata B, viene eliminata anche A. Questo comportamento è noto come eliminazione a cascata.
SET_NULL - Quando viene eliminata B, il valore del campo chiave esterna su A viene impostato su null.
Se onDelete non è specificato, non viene eseguita alcuna operazione su A quando viene eliminata B.
deleteReference - Determina cosa accade a B quando viene eliminata A.
Se true, quando viene eliminata A, viene eliminata anche B.
Se false, o quando non è specificato, non viene eseguita alcuna operazione su B quando viene eliminata A.
* 
Quando un servizio di eliminazione a cascata viene utilizzato per eliminare un'entità, il parametro di input deleteReference nel servizio determina se vengono seguite le impostazioni deleteReference nelle informazioni di database per l'entità. Quando il parametro di input deleteReference è impostato su true, tutte le entità referenziate da chiavi esterne con deleteReference impostato su true vengono eliminate. Quando il parametro di input deleteReference è impostato su false, le entità referenziate non vengono eliminate.
Ad esempio, un giorno di calendario ripetuto (PTC.Shift.CalendarDayRepeating) è una relazione tra un calendario e una programmazione turni. Tale relazione viene definita nel giorno di calendario ripetuto con i campi chiave esterna che fanno riferimento agli UID del calendario (CalendarUID) e della programmazione turni (ShiftScheduleUID). Il codice seguente è ricavato dalle informazioni di database specificate per la data shape del giorno di calendario ripetuto (PTC.Shift.CalendarDayRepeating) nel servizio GetDBInfo dell'oggetto PTC.ShiftImpl.Manager:
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"
}]
Poiché onDelete è impostato su CASCADE per la chiave esterna calendarUid, se il calendario referenziato viene eliminato, viene eliminato anche il giorno di calendario ripetuto. Ciò garantisce l'integrità dei riferimenti. Il giorno di calendario ripetuto non può esistere, a meno che non sia presente il calendario.
Poiché deleteReference è impostato su true per la chiave esterna sul campo shiftScheduleUid, se il giorno di calendario ripetuto viene eliminato, deve essere eliminata anche la programmazione turni referenziata dal campo shiftScheduleUid. Questo comportamento è determinato da una decisione aziendale in base alla quale, se il giorno di calendario ripetuto viene eliminato, deve essere eliminata anche la programmazione turni correlata.
* 
Non è necessario specificare i comportamenti di eliminazione prima della sincronizzazione con il database per aggiungere una nuova data shape o una chiave esterna allo schema del database. Come best practice, i comportamenti di eliminazione devono essere specificati prima che vengano eliminate tutte le istanze delle data shape su uno dei lati della relazione di chiave esterna.
Servizi di eliminazione e comportamento di eliminazione delle chiavi esterne
I servizi utilizzati per eseguire le eliminazioni, sebbene soddisfino le impostazioni onDelete e deleteReference per ogni chiave esterna, si trovano nella thing shape di gestione del database (PTC.DBConnection.DBManagementThingShape). Questi servizi di eliminazione a cascata sono: BatchCascadeDelete, CascadeDelete e CollectActionForCascadeDelete. Tutti i manager si estendono da questa thing shape, pertanto ereditano questi servizi. Per ulteriori informazioni, vedere Servizi della thing shape di gestione del database.
Le azioni di eliminazione standard per singoli oggetti del modello di dati, ad esempio DeleteShift o DeleteJobOrder, eliminano solo l'entità specificata. Se eliminando solo tale entità si viola l'integrità dei riferimenti, il servizio non riesce. In questi casi, utilizzare i servizi di eliminazione a cascata. Un'eccezione è rappresentata dal servizio DeleteSite nell'oggetto PTC.MfgModelImpl.Manager che chiama il servizio CascadeDeleteModel.
È stato utile?