sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL-controlebeperking voor externe sleutelvoorwaarde

Dit zou werken voor 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;

En dan een controlebeperking op de user_has_job tabel:

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))
);

Werkt voor inzetstukken:

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

Dit is echter mogelijk:

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

Dus als u het bijwerken van gebruikers toestaat, moet u een update-trigger maken in de gebruikerstabel om dat te voorkomen als de gebruiker banen heeft.



  1. Wanneer moet ik een puntkomma versus een schuine streep gebruiken in Oracle SQL?

  2. Voorbeeld uit de praktijk, wanneer OUTER / CROSS APPLY in SQL gebruiken?

  3. Topantwoorden op 5 brandende vragen over de COALESCE-functie in SQL Server

  4. best practices voor mysqldump:deel 1 – MySQL-vereisten