Creacion de triggers que sustituyan a foreign keys
Publicado por Juan (4 intervenciones) el 02/05/2019 18:30:14
Hola buenas tardes. Me he apuntado en el foro porque veo que es la única web de consultas de Oracle que parece estar activa a dia de hoy. Me estoy sacando un grado superior, y la asignatura de base de datos me encanta, pero se me esta atascando. Me quedan 12 dias para entregar y en el ejercicio que tengo que hacer tengo varias tablas en las que tengo que mantener la integridad de datos, pero sin foreign keys porque es requisito del ejercicio. La teoría la sé, pero plasmarla no es tan sencillo:
- Si borro un registro en tabla 1, que es la principal, en tabla 2, si no existe referencia a ese registro, se tiene que borrar. Pero si hay referencia a ese registro en tabla 2, no debe borrarse en tabla 1 hasta que no se borre en tabla 2.
-Si creo un registro en tabla 2 que haga referencia a un registro que no existe en tabla 1, no se puede crear
-Si actualizo una fila en tabla 2, no debe actualizarse el registro principal del que viene, porque falla. Obviamente no puedo modificar una primary key que ya lo lleva implícito.
No sé si con esto me he explicado. Os pongo un ejemplo de tablas que nada tienen que ver con las mías para ver si me podéis orientar un poco, prefiero orientación a la solución, porque quiero aprender y dedicarme a ello.
tabla1
col1 -- Primary key
col2
col3
tabla2
col01-- primary key
col02
col1 -- supuesta foreign key
y el trigger de eliminación que he hecho es:
create or replace trigger mitrigger1
before delete on tabla1
referencing new as new old as old
for each row
declare
var number(4);
begin
select count(*) into var from table2 where col1=:new.col1;
if var < 1 then
raise_application_error (-20100, 'No se puede eliminar ese registro porque tiene dependencias');
end if;
end;
Compila bien, pero a la hora de eliminar en tabla 1 para que compruebe si existe en tabla 2 registro que referencie a la eliminación, no elimina, haya registros en tabla 2 o no.
Estoy con Oracle 11g, y con SQL Developer 4.1.2
Muchas gracias de antemano.
- Si borro un registro en tabla 1, que es la principal, en tabla 2, si no existe referencia a ese registro, se tiene que borrar. Pero si hay referencia a ese registro en tabla 2, no debe borrarse en tabla 1 hasta que no se borre en tabla 2.
-Si creo un registro en tabla 2 que haga referencia a un registro que no existe en tabla 1, no se puede crear
-Si actualizo una fila en tabla 2, no debe actualizarse el registro principal del que viene, porque falla. Obviamente no puedo modificar una primary key que ya lo lleva implícito.
No sé si con esto me he explicado. Os pongo un ejemplo de tablas que nada tienen que ver con las mías para ver si me podéis orientar un poco, prefiero orientación a la solución, porque quiero aprender y dedicarme a ello.
tabla1
col1 -- Primary key
col2
col3
tabla2
col01-- primary key
col02
col1 -- supuesta foreign key
y el trigger de eliminación que he hecho es:
create or replace trigger mitrigger1
before delete on tabla1
referencing new as new old as old
for each row
declare
var number(4);
begin
select count(*) into var from table2 where col1=:new.col1;
if var < 1 then
raise_application_error (-20100, 'No se puede eliminar ese registro porque tiene dependencias');
end if;
end;
Compila bien, pero a la hora de eliminar en tabla 1 para que compruebe si existe en tabla 2 registro que referencie a la eliminación, no elimina, haya registros en tabla 2 o no.
Estoy con Oracle 11g, y con SQL Developer 4.1.2
Muchas gracias de antemano.
Valora esta pregunta


0