Embora não tenha Oracle, fiz um teste rápido com PostgreSQL e seu primeiro exemplo (
IS_DISABLED
sendo NULL
e DISABILITY_INCOME_TYPE_ID
sendo 1):postgres=> select (null is null and 1 is null);
?column?
----------
f
(1 registro)
postgres=> select (null is null and 1 is null) or (null = 0 and 1 is null);
?column?
----------
f
(1 registro)
postgres=> select (null is null and 1 is null) or (null = 0 and 1 is null) or (null = 1);
?column?
----------
(1 registro)
Aqui vemos claramente que, neste caso, sua expressão (pelo menos no PostgreSQL) retorna NULL. Do manual ,
Portanto, se o Oracle se comportar da mesma forma que o PostgreSQL, a restrição de verificação passará .
Para ver se esse é o caso, evite as travessuras NULL verificando explicitamente e veja se funciona:
CHECK ((IS_DISABLED IS NULL AND DISABILITY_INCOME_TYPE_ID IS NULL)
OR (IS_DISABLED IS NOT NULL AND IS_DISABLED = 0 AND DISABILITY_INCOME_TYPE_ID IS NULL)
OR (IS_DISABLED IS NOT NULL AND IS_DISABLED = 1));