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

外部キー条件のPostgreSQLチェック制約

    これはINSERTSで機能します:

    create or replace function is_superuser(int) returns boolean as $$
    select exists (
        select 1
        from "user"
        where id   = $1
          and superuser = true
    );
    $$ language sql;
    

    次に、user_has_jobテーブルの制約を確認します。

    create table user_has_job (
        user_id integer references "user"(id),
        job_id integer references job(id),
        constraint user_has_job_pk PRIMARY KEY (user_id, job_id),
        constraint chk_is_superuser check (is_superuser(user_id))
    );
    

    インサートで機能します:

    postgres=# insert into "user" (name,superuser) values ('name1',false);
    INSERT 0 1
    postgres=# insert into "user" (name,superuser) values ('name2',true);
    INSERT 0 1
    
    postgres=# insert into job (description) values ('test');
    INSERT 0 1
    postgres=# insert into user_has_job (user_id,job_id) values (1,1);
    ERROR:  new row for relation "user_has_job" violates check constraint "chk_is_superuser"
    DETAIL:  Failing row contains (1, 1).
    postgres=# insert into user_has_job (user_id,job_id) values (2,1);
    INSERT 0 1
    

    ただし、これは可能です:

    postgres=# update "user" set superuser=false;
    UPDATE 2
    

    したがって、ユーザーの更新を許可する場合は、ユーザーがジョブを持っている場合にそれを防ぐために、usersテーブルに更新トリガーを作成する必要があります。



    1. Windowsでxamppのコマンドラインにアクセスする方法

    2. ビッグデータのクォンダリー:ハードウェアまたはソフトウェア…アプライアンス…

    3. 12cDBA_USERSの変更

    4. MySQLのランク関数