Đ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.