sql >> データベース >  >> RDS >> Oracle

生年月日の制約を確認しますか?

    チェック制約は決定論的でなければなりません。つまり、特定の行は常に制約を満たす必要があります。そうでない場合は、常に制約を満たすことができません。ただし、SYSDATE 戻り値は絶えず変化するため、本質的に非決定的です。したがって、CHECKを定義することはできません。 SYSDATEを呼び出す制約 またはその他のユーザー定義関数。

    SYSDATEを参照しようとした場合 制約定義では、エラーが発生します

    SQL> ed
    Wrote file afiedt.buf
    
      1  create table t(
      2      birth_date date check( birth_date between date '1900-01-01' and
      3                                                sysdate )
      4* )
    SQL> /
                                                  sysdate )
                                                  *
    ERROR at line 3:
    ORA-02436: date or system variable wrongly specified in CHECK constraint
    

    CHECKを作成できます 最小日付と最大日付の両方がハードコーディングされている制約。ただし、制約を絶えず削除して再作成する必要があるため、これは特に実用的ではありません。

    SQL> ed
    Wrote file afiedt.buf
    
      1   create table t(
      2       birth_date date check( birth_date between date '1900-01-01' and
      3                                                 date '2011-12-08' )
      4*  )
    SQL> /
    
    Table created.
    

    この種の要件を適用する実際的な方法は、テーブルにトリガーを作成することです

    CREATE OR REPLACE TRIGGER check_birth_date
      BEFORE INSERT OR UPDATE ON employee
      FOR EACH ROW
    BEGIN
      IF( :new.emp_dob < date '1900-01-01' or 
          :new.emp_dob > sysdate )
      THEN
        RAISE_APPLICATION_ERROR( 
          -20001, 
          'EMployee date of birth must be later than Jan 1, 1900 and earlier than today' );
      END IF;
    END;
    


    1. SQLServerでのトランザクションROLLBACKの使用

    2. インスタンス設定を取得するためのストアドプロシージャ

    3. SQLテーブルの初心者向けガイド

    4. SQL Server AlwaysOn(可用性グループ)アーキテクチャとステップバイステップのインストール-2