PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Use gatilhos em tabelas herdadas para substituir chaves estrangeiras


Primeiro, livre-se do FK com algo assim:
alter table address drop constraint address_person_id_fkey

Se isso se queixa de não haver um address_person_id_fkey restrição, use \d address; em psql para descobrir como se chama o FK.

Então, um simples gatilho como este deve fazer o truque:
create or replace function pseudo_fk_for_address() returns trigger as $$
begin
    if not exists(select 1 from person where id = new.person_id) then
        raise exception 'No such person: %', new.person_id;
    end if;
    return new;
end;
$$ language plpgsql;

E anexe assim:
create trigger pseudo_fk_for_address_trigger before insert or update on address 
for each row execute procedure pseudo_fk_for_address();

Então você receberá um erro como este se tentar adicionar um endereço para alguém que não existe em person (incluindo as tabelas que herdam dele):
playpen=> insert into address (person_id, email, country, citycode, city, addressline) values (3, 'ab', 'b', 2, 'c', 'd');
ERROR:  No such person: 3

Você gostaria de adicionar um gatilho BEFORE DELETE a person para evitar referências pendentes, essa estrutura básica seria praticamente a mesma. Você pode querer um índice em address.person_id para ajudar a suportar o gatilho BEFORE DELETE também.

Referências: