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.
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 sevizio 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 entrambe le chiavi esterne, se una delle definizioni di lavorazione referenziate viene eliminata, viene eliminato anche il link di definizioni di lavorazione. Ciò garantisce l'integrità dei riferimenti. Il link di definizioni di lavorazione non può esistere a meno che non sia presente la definizione di lavorazione su ogni lato della relazione.
Poiché deleteReference è impostato su true per la chiave esterna sul campo ChildUID, se il link di definizioni di lavorazione viene eliminato, viene eliminata anche la definizione di lavorazione referenziata dal campo ChildUID. Questo comportamento è determinato da una decisione aziendale che specifica che, in caso di eliminazione del link tra una definizione di lavorazione padre e una definizione di lavorazione figlio, venga eliminata anche la definizione di lavoro figlio.
* 
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.
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 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?