PostgreSQL
 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

Така че, ако разрешите актуализиране на потребителите, трябва да създадете тригер за актуализиране в таблицата с потребители, за да предотвратите това, ако потребителят има работни места.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Връщане на Unix Timestamp в PostgreSQL

  2. Ръководство за използване на pgBouncer за PostgreSQL

  3. Грешка в Postgres:не можа да се отвори файл за четене:Разрешението е отказано

  4. Как да картографирате PostgreSQL enum с JPA и Hibernate

  5. Как да накарате PyPy, Django и PostgreSQL да работят заедно?