PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Batasan pemeriksaan PostgreSQL untuk kondisi kunci asing

Ini akan bekerja untuk 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;

Dan kemudian cek batasan pada tabel 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))
);

Berfungsi untuk sisipan:

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

Namun ini mungkin:

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

Jadi, jika Anda mengizinkan pembaruan pengguna, Anda perlu membuat pemicu pembaruan di tabel pengguna untuk mencegahnya jika pengguna memiliki pekerjaan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara mengatur batas waktu koneksi di SQLAlchemy

  2. Bagaimana cara mengaktifkan php untuk bekerja dengan postgresql?

  3. Bagaimana cara mendapatkan min/maks dari dua bilangan bulat di Postgres/SQL?

  4. Bagaimana cara memecahkan kode hex kolom byte PostgreSQL ke int16/uint16 di r?

  5. Dapatkan pohon orang tua + anak dengan pg-promise