Задание поведения при удалении для внешних ключей
При удалении сущности для какой-либо стороны в отношениях по внешнему ключу, необходимо указать действия для сущности другой стороны отношений. Это гарантирует сохранение целостности ссылочных данных и следование решениям, основанным на бизнес-логике.
Поведение при удаление указано в сведениях о базе данных для профиля данных в том же массиве, где указаны внешние ключи. Поведение при удалении (при наличии) указывается для каждого отдельного внешнего ключа. Дополнительные сведения см. в разделе Добавление или удаление внешних ключей.
В описаниях ниже А является сущностью со внешним ключом, а В — сущностью с полем, на которое ссылается внешний ключ.
onDelete: устанавливает действие для A при удалении B.
CASCADE: при удалении B, A тоже удаляется. Это называется каскадным удалением.
SET_NULL: при удалении B значение поля внешнего ключа в A устанавливается на null.
Если действие onDelete не указано, то при удалении B с A ничего не произойдет.
deleteReference: устанавливает действие для В при удалении А.
Если значение true, то В также удаляется при удалении А.
Если значение false или не указано, то при удалении А с В ничего не происходит.
* 
Если для удаления объекта используется служба каскадного удаления, то входной параметр deleteReference для службы определяет, будут ли выполнены настройки deleteReference в информации о базе данных для сущности. Если для входного параметра deleteReference задано значение true, то все сущности, на которые ссылаются внешние ключи с настройкой deleteReference на значение true, будут удалены. Если для входного параметра deleteReference задано значение false, то сущности со ссылками не удалятся.
Например, повторяющийся календарный день (PTC. Shift. PTC.Shift.CalendarDayRepeating) – это связь между календарем и расписанием смены. Это определяется для повторяющегося календаря с полями внешнего ключа, которые ссылаются на UID календаря (CalendarUID) и расписание смены (ShiftScheduleUID). Следующий код из информации базы данных, указанной для формы данных повторяющегося календаря (PTC.Shift.CalendarDayRepeating) в сервисе GetDBInfo вещи 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"
}]
Поскольку onDelete установлено на CASCADE для внешнего ключа calendarUid, то при удалении ссылочного календаря также удаляется повторяющийся календарный день. Это обеспечивает целостность ссылок; повторяющийся календарный день не может существовать, если не указан календарь.
Так как deleteReference установлено на true для внешнего ключа в поле shiftScheduleUid, то, при удалении ссылочного календаря, расписание смены , на которое ссылается поле shiftScheduleUid, тоже будет удалено. Это поведение определяется бизнес-решением, указывающим, что при удалении повторяющегося календарного дня расписание смены, к которому он относится, должно быть удалено.
* 
Не нужно указывать поведение при удалении до синхронизации с базой данных для добавления нового профиля данных или внешнего ключа в схему базы данных. Рекомендуется указывать поведение при удалении до удаления экземпляров профилей данных на какой-либо из сторон отношений внешнего ключа.
Службы удаления и поведение внешнего ключа
Сервисы для удаления, отвечающие настройкам onDelete и deleteReference для каждого внешнего ключа, находятся в профиле вещи управления базой данных (PTC.DBConnection.DBManagementThingShape). Следующие службы являются службами каскадного удаления: BatchCascadeDelete, CascadeDelete и CollectActionForCascadeDelete. Все диспетчеры являются производными от этого профиля вещи, поэтому они наследуют данные сервисы. Дополнительные сведения см. в разделе Сервисы профиля вещи управления базой данных.
При стандартных действиях удаления для отдельных объектов модели данных DeleteShift или DeleteJobOrder удаляется только указанная сущность. Если при удалении одной такой сущности нарушается целостность ссылочных данных, сервис не выполняется. В таких случаях используйте сервисы каскадного удаления. Исключением является сервис DeleteSite в вещи PTC.MfgModelImpl.Manager, которая вызывает сервис CascadeDeleteModel.
Было ли это полезно?