Это довольно распространенная проблема, но я еще не нашел точный вопрос и ответ, который я ищу.
У меня есть одна таблица с FK, указывающая на собственный PK, чтобы включить произвольно глубокую иерархию, такую как классический tblEmployee с столбцом Manager
, который является FK с PK tblEmployee.EmployeeID.
Скажем, в моем приложении пользователь
- Создает новых сотрудников Alice и Dave без менеджера, потому что они генеральный директор и президент. Таким образом,
tblEmployee.Manager
имеет значение NULL для этих двух записей. - Создайте нового сотрудника Боба, с Алисой в качестве менеджера. Затем создайте Чарльза с Бобом в качестве его менеджера. Их поля "Менеджер" содержат значение "Первичный ключ" другой записи в
tblEmployee
. - Редактировать запись сотрудника для Алисы, что означает, что у Дэйва есть ее менеджер (это будет хорошо), но случайно назначить менеджера Алисы Чарльзом, который находится на двух уровнях от Алисы в дереве.
Теперь таблица находится в круглой ссылке вместо правильного дерева.
Каков наилучший способ убедиться, что шаг 3 не может быть выполнен в приложении? Мне просто нужно убедиться, что он откажется выполнять последнее обновление SQL и вместо этого отобразит сообщение об ошибке.
Я не придирчив к тому, что это ограничение базы данных в SQL Server (должно работать в 2008 или 2012 году) или с какой-то подпрограммой проверки на уровне бизнес-логики моего приложения С#.