Я боролся с этим проверочным ограничением в течение нескольких часов и надеялся, что кто-то будет достаточно любезен, чтобы объяснить, почему это проверочное ограничение не делает то, что, я думаю, должно быть.
ALTER TABLE CLIENTS
add CONSTRAINT CHK_DISABILITY_INCOME_TYPE_ID CHECK ((IS_DISABLED IS NULL AND DISABILITY_INCOME_TYPE_ID IS NULL) OR (IS_DISABLED = 0 AND DISABILITY_INCOME_TYPE_ID IS NULL) OR (IS_DISABLED = 1));
По сути, вы должны быть инвалидом, чтобы получать доход по инвалидности. Похоже, что первая часть этого контрольного ограничения (IS_DISABLED IS NULL AND DISABILITY_INCOME_TYPE_ID IS NULL)
не применяется (см. Ниже).
Доступными значениями для DISABILITY_INCOME_TYPE_ID
являются 1 и 2, которые применяются через внешний ключ. И IS_DISABLED
, и DISABILITY_INCOME_TYPE_ID
могут быть нулевыми.
-- incorrectly succeeds (Why?)
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (null, 1);
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (null, 2);
-- correctly fails
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (0, 1);
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (0, 2);
-- correctly succeeds
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (0, null);
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (1, 1);
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (1, 2);
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (1, null);
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (null, null);
Спасибо за вашу помощь,
Michael