Definición del comportamiento de borrado con claves externas
Cuando se borra la entidad en cualquiera de los lados de una relación de clave externa, se debe especificar lo que sucede con la entidad en el otro lado de la relación. De este modo, se garantiza que se mantiene la integridad referencial y que se siguen las decisiones basadas en la lógica de negocio.
El comportamiento de borrado se especifica en la información de la base de datos para una definición de datos, en la misma matriz en la que se especifican las claves externas. El comportamiento de borrado, si existe, se especifica para cada clave externa individual. Para obtener más información, consulte Adición o eliminación de claves externas.
En las descripciones siguientes, A es la entidad con la clave externa y B es la entidad con el campo al que hace referencia la clave externa.
onDelete: permite determinar qué sucede con A cuando se borra B.
CASCADE: si se borra B, también se borra A. Esto se conoce como borrado en cascada.
SET_NULL: cuando se borra B, el valor del campo de la clave externa en A se define en nulo.
Si onDelete no se especifica, no le sucede nada a A cuando se borra B.
deleteReference: permite determinar lo que le sucede a B cuando se borra A.
Si es verdadero, cuando se borra A, también se borra B.
Si es falso o no se especifica, no le sucede nada a B cuando se borra A.
Por ejemplo, un día del calendario de repetición (PTC.Shift.CalendarDayRepeating) es una relación entre un calendario y una programación de turnos. Esto se define en el día del calendario de repetición con campos de clave externa que hacen referencia a los UID del calendario (CalendarUID) y a la programación de turnos (ShiftScheduleUID). El siguiente código procede de la información de la base de datos especificada para la definición de datos del día del calendario de repetición (PTC.Shift.CalendarDayRepeating) en el servicio GetDBInfo de la cosa 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"
}]
Dado que onDelete está definido como CASCADE para las dos claves externas, si se borra una de las definiciones de trabajo a las que se hace referencia, también se borra el vínculo de definición de trabajo. De este modo, se garantiza la integridad referencial; el vínculo de definición de trabajo no puede existir a no ser que la definición de trabajo de cada lado de la relación esté presente.
Dado que deleteReference está definido como verdadero para la clave externa en el campo ChildUID, si se borra el vínculo de definición de trabajo, también se borra la definición de trabajo a la que hace referencia el campo ChildUID. Este comportamiento viene determinado por la decisión de negocios que especifica que si se borra el vínculo entre una definición de trabajo padre e hija, también se debe borrar la definición de trabajo hija.
* 
No es necesario especificar los comportamientos de borrado antes de sincronizar con la base de datos para añadir una nueva definición de datos o una clave externa al esquema de base de datos. Como práctica recomendada, se deben especificar los comportamientos de borrado antes de que se borren las instancias de las definiciones de datos de cualquiera de los lados de la relación de clave externa.
Los servicios que se utilizan para realizar borrados, satisfaciendo las configuraciones onDelete y deleteReference de cada clave externa, se encuentran en la definición de cosa de la gestión de bases de datos (PTC.DBConnection.DBManagementThingShape). Estos servicios son BatchCascadeDelete, CascadeDelete y CollectActionForCascadeDelete. Todos los administradores se extienden desde esta definición de cosa, por lo que heredan estos servicios. Para obtener más información, consulte Servicios de definición de cosa de gestión de base de datos.
Las acciones de borrado estándar para objetos de modelo de datos individuales, como DeleteShift o DeleteJobOrder solo borran la entidad especificada. Si el hecho de borrar solo esa entidad infringe la integridad referencial, el servicio fallará. En estos casos, utilice los servicios de borrado en cascada. Una excepción a esto es el servicio DeleteSite en la cosa PTC.MfgModelImpl.Manager que llama al servicio CascadeDeleteModel.
¿Fue esto útil?