Oracle - Creacion de triggers que sustituyan a foreign keys

 
Vista:
sin imagen de perfil
Val: 8
Ha disminuido su posición en 8 puestos en Oracle (en relación al último mes)
Gráfica de Oracle

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.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Victor
Val: 25
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Creacion de triggers que sustituyan a foreign keys

Publicado por Victor (20 intervenciones) el 02/05/2019 21:03:42
Buenas,

tu validación no es la correcta;
1
2
select count(*) into var from table2 where col1=:new.col1;
if var < 1 then
si en la table2 no hay registros, el valor de var es 0, por lo que siempre se cumple tu condición.
debería ser;
1
if var >= 1 then
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Creacion de triggers que sustituyan a foreign keys

Publicado por Juan (2 intervenciones) el 02/05/2019 21:08:17
Muchas gracias por responder tan rapido, ahora estoy en clase, pero créeme que mañana lo probaré, porque llevo tantas horas infructuosas, que agradezco cualquier minima ayuda. Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Victor
Val: 25
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Creacion de triggers que sustituyan a foreign keys

Publicado por Victor (20 intervenciones) el 02/05/2019 21:16:49
Espero te sirva!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 8
Ha disminuido su posición en 8 puestos en Oracle (en relación al último mes)
Gráfica de Oracle

Creacion de triggers que sustituyan a foreign keys

Publicado por Juan (4 intervenciones) el 03/05/2019 10:38:47
Agradezco mucho tu ayuda, Victor, pero no funciona. Cuando hago el delete, la fila se elimina y no muestra ni mensaje, solo 1 fila eliminada. Si pongo var = 0 me da el mensaje de error que le pongo además de ora-20100,ora-06512 y ora-04088 y no elimina nada, haya o no haya registros en tabla 2.
Esa captura que puse la copie con el ultimo intento que hice, pero no consigo que funcione correctamente y me frustra. He probado tambien con cursor, y nada. He probado con var != null y con var is not null y tampoco. Ademas, ayer me di cuenta que la version que tenia de SQL Developer era muy antigua y hoy ya he empezado con la ultima. pero ni aun asi. En vez de raise_application_error, he probado a redirigir con dbms_output.put_line y tampoco, ni con manejo de excepciones. Será muy simple, pero no doy con ello. He encontrado una pagina que sustituyen foreignkey por trigger pero es con SQL Server y dados mis excasos conocimientos, no sé extrapolarlo para ver qué está pasando.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Victor
Val: 25
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Creacion de triggers que sustituyan a foreign keys

Publicado por Victor (20 intervenciones) el 03/05/2019 14:32:01
Ok. ahora me fijo y veo que también está mal la referencia de usar el :new.
Puesto que estas haciendo un delete no existe new, deberías usar el old asi;
1
select count(*) into var from tabla2 where col1 = :old.col1;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 8
Ha disminuido su posición en 8 puestos en Oracle (en relación al último mes)
Gráfica de Oracle

Creacion de triggers que sustituyan a foreign keys

Publicado por Juan (4 intervenciones) el 03/05/2019 15:37:09
Cuando estas obcecado con algo, vas como los caballos de lidia :( Muchas gracias de nuevo!! Vamos a probar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 8
Ha disminuido su posición en 8 puestos en Oracle (en relación al último mes)
Gráfica de Oracle

Creacion de triggers que sustituyan a foreign keys

Publicado por Juan (4 intervenciones) el 03/05/2019 16:02:03
Madre mía, tan sencillo como eso. Al final funciona, y gracias a ti Victor. Me da unos mensajes de error pero esos ya los canalizaré que no me preocupan, pero funcionar, funciona. Tantas horas perdidas por lo que te he dicho antes: obcecación. Si hay algo que yo pueda hacer, no dudes en decírmelo!!! Y lo mas importante de todo, es que entiendo por qué está funcionando.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar