3

列 BIRTH_DATE のすべての日付が明日より前で、100 年以上前になるように、日付範囲に CHECK 制約を適用したいと考えています。CHECK 制約で次の式を試しました。

BIRTH_DATE >= (sysdate - numtoyminterval(100, 'YEAR')) AND BIRTH_DATE < sysdate + 1

しかし、「ORA-02436: CHECK 制約で日付またはシステム変数が間違って指定されました」というエラーを受け取りました。

トリガーの代わりに CHECK 制約を使用してこれを達成する方法はありますか?

4

2 に答える 2

5

オラクル社がこの制限を設ける理由については、更新の場合でも、チェック制約は常に TRUE と評価される必要があります。データベースに 99 歳の人物を追加し、その人物の電子メール アドレスを (たとえば) 2 年後に更新しようとすると、チェック制約違反が発生します。

必要に応じて、別の列 CREATED_DATE をデフォルトで SYSDATE に設定し、制約を作成することができます。

BIRTH_DATE >= (CREATED_DATE - numtoyminterval(100, 'YEAR')) 
AND BIRTH_DATE < CREATED_DATE + 1

ただし、INSERT 時にのみチェックを実行したい場合は、データベース トリガーまたは API コードで実行します。

于 2008-10-16T11:01:37.443 に答える
3

チェック制約式は決定論的でなければならないため、この種のスライド日付範囲はチェック制約では強制できません。SQLリファレンスから

チェック制約の条件には、次の構造を含めることはできません。

* Subqueries and scalar subquery expressions
* Calls to the functions that are not deterministic (CURRENT_DATE,

CURRENT_TIMESTAMP、DBTIMEZONE、LOCALTIMESTAMP、SESSIONTIMEZONE、SYSDATE、SYSTIMESTAMP、UID、USER、および USERENV)

于 2008-10-16T01:05:04.840 に答える