PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Ograniczenie sprawdzania PostgreSQL dla warunku klucza obcego

To zadziała dla WSTAWEK:

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

A następnie sprawdź ograniczenie w tabeli 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))
);

Działa na wkładki:

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

Jest to jednak możliwe:

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

Jeśli więc zezwolisz na aktualizowanie użytkowników, musisz utworzyć wyzwalacz aktualizacji w tabeli użytkowników, aby temu zapobiec, jeśli użytkownik ma zadania.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zmienić użytkownika na superużytkownika w PostgreSQL?

  2. Zaktualizuj lub wstaw (wiele wierszy i kolumn) z podzapytania w PostgreSQL

  3. Jak zresetować domyślne hasło użytkownika postgresql 9.2 (zwykle „postgres”) w systemie Mac OS x 10.8.2?

  4. Spring Data JPA Auditing nie działa dla metody aktualizacji JpaRepository z adnotacją @Modifying, dlaczego?

  5. Błąd PostgreSQL podczas próby utworzenia rozszerzenia