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