Добавление или удаление внешних ключей
Внешний ключ - это поле в одной таблице базы данных, которое ссылается на первичный ключ в другой таблице. Внешний ключ определяется как ограничение на связанный столбец в таблице базы данных.
При наличии ограничения внешнего ключа поле должно быть либо пустым, либо значение должно указывать на существующее значение первичного ключа в ссылочной таблице. Например, поле SiteUID на смене является внешним ключом, который ссылается на UID предприятия. В результате значение для SiteUID в смене должно быть пустым, либо соответствовать существующему значению UID для предприятия.
Ограничение внешнего ключа также предотвращает удаление строк из таблицы базы данных, на которые ссылаются поля внешнего ключа. Например, если смена имеет значение SiteUID 5, то т.к. ограничение внешнего ключа на поле SiteUID ссылается на UID на предприятии, предприятие со значением UID 5 не может быть удалено.
Добавление внешнего ключа
Чтобы добавить внешний ключ в существующую таблицу базы данных:
1. Создайте новый компоновочный блок, который расширяется из компоновочного блока PTC, содержащего диспетчер для сущности, связанной с таблицей базы данных. Эти диспетчеры указаны в таблице DefaultGlobalManagerConfiguration на странице Конфигурации вещи PTC.Base.Manager. Например, чтобы добавить внешний ключ для порядка работы, перейдите в вещь PTC.JobOrderImpl.Manager.
Дополнительные сведения см. в разделе Создание нового компоновочного блока.
2. Перейдите к шаблону вещи диспетчера для нового компоновочного блока.
3. В разделе Сервисы переопределите сервис GetDBInfo для сущности, к которой добавляется внешний ключ. Например, для добавления внешнего ключа в таблицу базы данных для порядков работы переопределите сервис GetDBInfo в вещи PTC.JobOrderImpl.Manager.
4. В редакторе сценариев прокрутите вниз до записи профиля данных, в который необходимо добавить внешний ключ.
5. Добавьте массив foreignKeys в профиль данных со следующими свойствами:
identifier: наименование сущности в базе данных. Если значение не указано, то система автоматически создает его в формате <table_name>_<column_name>_fk. Указанное значение должно быть уникальным в рамках указанных и созданных автоматически значений. Значение не должно превышать максимальную длину, разрешенную для идентификаторов базы данных.
name: наименование поля, которое должно быть внешним ключом в текущем профиле данных. Базовый тип поля внешнего ключа должен соответствовать базовому типу ссылочного поля. Например, если базовый тип ссылочного поля STRING, то поле со значением внешнего ключа должно быть также базового типа STRING.
referenceDataShapeName: профиль данных ссылочной таблицы базы данных.
referenceFieldName: имя поля, содержащего ссылочное значение.
onDelete: влияет на экземпляры текущего профиля данных при удалении ссылочного профиля данных.
deleteReference: влияет на экземпляры ссылочного профиля данных при удалении текущего профиля данных.
Дополнительные сведения о действиях при удалении см. в Задание поведения при удалении для внешних ключей.
6. Нажмите Сохранить, чтобы сохранить изменения для сервиса.
7. Перейдите к вещи PTC.DBConnection.Manager.
8. Синхронизируйте информацию базы данных со схемой базы данных. Дополнительные сведения см. в разделе Синхронизация информации и схемы базы данных.
Удаление внешнего ключа
Чтобы удалить внешний ключ:
* 
Не удаляйте внешние ключи по умолчанию. Удалите только те внешние ключи, которые были добавлены ранее, например: Добавление пользовательских свойств в сущности модели данных или Добавление пользовательских сущностей в модель данных.
1. Создайте новый компоновочный блок, который расширяется из компоновочного блока PTC, содержащего диспетчер для сущности, связанной с таблицей базы данных. Эти диспетчеры указаны в таблице DefaultGlobalManagerConfiguration на странице Конфигурации вещи PTC.Base.Manager. Например, чтобы удалить внешний ключ из порядка работы, перейдите в вещь PTC.JobOrderImpl.Manager.
Дополнительные сведения см. в разделе Создание нового компоновочного блока.
2. Перейдите к вещи базы данных, настроенной для вашей системы, например, PTC.DBConnection.MSSQLDatabase.
3. В разделе Службы выполните сервис RemoveForeignKey со следующими входными данными:
dataShapeName: профиль данных для таблицы, из которой удаляется ограничение внешнего ключа.
fieldName: поле в профиле данных, в котором удаляется ограничение внешнего ключа.
dbInfo: описание JSON внешнего ключа, который необходимо удалить. Необходимо предоставить такую же информацию о identifier (при наличии), name, referenceDataShapeName и refereceFieldName, указанную в службе GetDBInfo, где определен внешний ключ. Служба будет игнорировать значения onDelete или deleteReference, если они включены в состав.
4. Щелкните Выполнить.
5. В вещи диспетчера компоновочного блока, созданного на 1 этапе, перейдите к сервису GetDBInfo, в котором установлен внешний ключ, и удалите определение внешнего ключа для сервисов. Если удаление не выполнено, то внешний ключ добавляется обратно в базу данных при запуске служб синхронизации.
Например, для удаления ограничения внешнего ключа в том случае, если не указан identifier в поле с именем WorkDefinitionUID в профиле данных MyObject, укажите следующие входные параметры:
dataShapeNameMyObject
fieldNameWorkDefinitionUID
dbInfo
{
"name":"WorkDefinitionUID",
"referenceDataShapeName":"PTC.SCA.SCO.WorkDefinition",
"referenceFieldName":"UID"
}
Было ли это полезно?