sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL-kontrollbegränsning för främmande nyckelvillkor

Detta skulle fungera för INSLAG:

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

Och sedan en kontrollkontraint i tabellen 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))
);

Fungerar för inlägg:

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

Detta är dock möjligt:

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

Så om du tillåter uppdatering av användare måste du skapa en uppdateringstrigger på användartabellen för att förhindra det om användaren har jobb.



  1. Ta reda på om ett objekt är en användardefinierad tabell i SQL Server med OBJECTPROPERTY()

  2. Exempel på PLSQL-markörer - explicita, implicita och referensmarkörer

  3. Anslutningshantering och strypning med ProxySQL

  4. Optimala MySQL-inställningar för frågor som levererar stora mängder data?