PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Ràng buộc kiểm tra PostgreSQL cho điều kiện khóa ngoại

Điều này sẽ hoạt động cho 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;

Và sau đó kiểm tra đối chiếu trên bảng 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))
);

Hoạt động cho phụ trang:

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

Tuy nhiên, điều này có thể thực hiện được:

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

Vì vậy, nếu bạn cho phép cập nhật người dùng, bạn cần tạo trình kích hoạt cập nhật trên bảng người dùng để ngăn điều đó xảy ra nếu người dùng có việc làm.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo bản sao của cơ sở dữ liệu trong PostgreSQL

  2. Quản lý tính khả dụng cao trong PostgreSQL - Phần III:Patroni

  3. Tôi quên mật khẩu tôi đã nhập trong khi cài đặt postgres

  4. Tại sao giá trị NULL lại xuất hiện đầu tiên khi đặt hàng DESC trong một truy vấn PostgreSQL?

  5. Cách EXCEPT hoạt động trong PostgreSQL