sql >> Base de Datos >  >> RDS >> PostgreSQL

Use disparadores en tablas heredadas para reemplazar claves foráneas

Primero deshazte del FK con algo como esto:

alter table address drop constraint address_person_id_fkey

Si eso se queja de que no hay una address_person_id_fkey restricción luego use \d address; en psql para saber cómo se llama el FK.

Entonces un disparador simple como este debería funcionar:

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;

Y adjúntalo así:

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

Entonces obtendrá un error como este si intenta agregar una dirección para alguien que no existe en person (incluidas las tablas que heredan de él):

playpen=> insert into address (person_id, email, country, citycode, city, addressline) values (3, 'ab', 'b', 2, 'c', 'd');
ERROR:  No such person: 3

Le gustaría agregar un disparador ANTES DE ELIMINAR a person para evitar referencias colgantes, esa estructura básica sería más o menos la misma. Es posible que desee un índice en address.person_id para ayudar a admitir el activador ANTES DE ELIMINAR también.

Referencias: