Если при удалении элемента сущности-классификатора автоматически удаляются все элементы классифицируемой сущности, которые ссылались на удаляемый элемент, то такая операция называется каскадным удалением данных. | ||
Каскадное удаление можно включить либо на уровне СУБД (например, в Microsoft SQL Server для этого достаточно установить соответствующий флажок на форме редактирования связи), либо отработать на уровне триггеров.
С понятием каскадного удаления данных связана так называемая доменно-ключевая нормальная форма. Так, при этой форме невозможно удалить элемент классификатора, если на него есть хотя бы одна ссылка из классифицируемой сущности.
Операция проверки возможности удаления элемента классификатора и запрещения его удаления в случае наличия ссылок на него называется контролем целостности данных (data integrity check). | ||
Внимание! В подавляющем большинстве случаев не следует пользоваться каскадным удалением данных: велика вероятность того, что при удалении элемента классификатора, незначительного по смыслу, будет удалено множество важных данных классифицируемой сущности. Ещё более разрушительные последствия могут проявиться, если классифицируемая сущность также является классификатором для третьей сущности. Вместо каскадного удаления рекомендуем пользоваться проверкой целостности данных. | ||
В настоящее время Битрикс практически не поддерживает ни каскадное удаление, ни проверку целостности данных. Так, при удалении элемента классификатора – свойство-ссылка элемента классифицируемой сущности просто-напросто очищается.
Это особенно опасно в том случае, если поле-ссылка определено как обязательное к заполнению: в случае его очистки велика вероятность, что этот элемент нельзя будет корректно обработать программно (код-то написан с расчётом на то, что поле стопроцентно заполнено). Также нельзя будет изменить какое-либо другое поле данного элемента в административном интерфейсе до тех пор, пока не будет чем-либо заполнено поле-ссылка (это может привести в недоумение не слишком опытного редактора). | ||
В качестве решения проблемы следует использовать аналоги триггеров для Битрикса – обработчики событий, связанных с инфоблоками.
Внимание! Не следует путать файлы, вызываемые при редактировании элемента на детальной форме в административном интерфейсе, и обработчики событий на уровне инфоблоков. Только обработчики событий на уровне инфоблоков гарантированно отработают не только при визуальном (из админки), но и при программном удалении/модификации элемента. | ||
Файлы, вызываемые при редактировании/удалении элемента на детальной форме в административном интерфейсе, не вызываются при быстром редактировании элементов в форме отчёта (списка элементов инфоблока) или программном редактировании/удалении элементов инфоблока с помощью API. | ||
Практически единственный случай, когда следует предпочесть каскадное удаление данных – это одновременное удаление строк из «развязочной» таблицы при удалении строки одной из связываемых таблиц. При этом, разумеется, следует убедиться, что «развязочная» таблица не имеет других связей, в которых она выступала бы в качестве классификатора.
19 марта 2010 года