-1

ユーザーの誕生日が 18 歳以上であることを確認したい。以下のチェック制約を使用しました。

(FLOOR((MONTHS_BETWEEN(DOB,SYSDATE))/12))>=18

生年月日: 生年月日のテーブルのフィールド。

しかし、次のエラーが発生しました:

DOB は無効な識別子です。

ありがとう!

4

2 に答える 2

4

Oracle では、CHECK 制約でシステム変数を参照することはできません。実際、制約が不確定になるため、SQL dbms がそれを許可しているとしたら、少し驚かれることでしょう。

データベース レベルでこれを回避する方法はいくつか考えられます。

  • トリガーを使用します。
  • 今日から少なくとも 18 年前の日付のテーブルへの外部キー参照を使用します。毎日行を挿入するジョブが必要です。ただし、タイムゾーンが少し問題になる場合があります。
  • ユーザーが 18 歳以上であると主張しているという事実を保存します。

CHECK 制約に関する制限事項

于 2013-03-02T10:21:02.350 に答える
1

Oracle のドキュメントには、チェック制約では決定論的関数のみが許可されることが明確に記載されています。sysdateなどsystimestampは明示的に禁止されています。 詳細をご覧ください。

この制限を回避する一般的な方法の 1 つは、データ モデルを利用することです。たとえば、 USERS テーブルには REGISTRATION_DATE がありますか? 確かにそのようなものがあるはずです。当然のことながら、REGISTRATION_DATE のデフォルトはsysdateand です。あなたの制約は合法になります:

(FLOOR((MONTHS_BETWEEN(REGISTRATION_DATE, DOB))/12))>=18

ちなみに、 の引数の順序MONTHS_BETWEEN()は (later_date、early date) になっていることに注意してください。 それをチェックしてください

于 2013-03-03T10:01:23.103 に答える