Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Trigger ... error al crear (https://www.clubdelphi.com/foros/showthread.php?t=119)

Tomás 06-05-2003 17:44:11

Trigger ... error al crear
 
Hola a todos:

Tengo dos tablas (PROFES, FALTAS) y quiero hacer un trigger que al borrar un profesor de la primera tabla (PROFES) borre antes las lineas de faltas que tiene en la segunda (FALTAS)

Campos PROFES:
CODIGO -> primary key
NOMBRE
etc.

Campos FALTAS
FALTA -> primary key
PROFESOR
INICIOFALTA
etc.

FOREIGN KEY ("PROFESOR") REFERENCES PROFES ("CODIGO")

He intentado hacer este trigger:

CREATE TRIGGER FALTAS_BD FOR FALTAS
BEFORE DELETE
AS
BEGIN
DELETE FROM FALTAS
WHERE
PROFESOR=:OLD_CODIGO;
END

y me da el siguiente error:

Dynamic SQL Error
SQL error code = -104
Unexpected end of command
Statement: CREATE TRIGGER FALTAS_BD FOR FALTAS
BEFORE DELETE
AS
BEGIN
DELETE FROM FALTAS
WHERE
PROFESOR=:OLD_CODIGO

No se ni por qué da error, ni si el trigger está bien, pues es el primero que intento hacer.

Muchas gracias. Tomás.

__cadetill 06-05-2003 18:30:44

si quieres que te borre las faltas del profesor, el trigger tienes que crearlo en la tabla de profesores, no en la de faltas

Código:


CREATE TRIGGER PROFES_BD0 FOR PROFES
ACTIVE BEFORE DELETE POSITION 0
AS
begin
  delete from faltas a where a.profesor = old.codigo;
end

espero te sirva

kinobi 06-05-2003 19:41:46

Re: Trigger ... error al crear
 
Hola,

Cita:

Posteado originalmente por Tomás
FOREIGN KEY ("PROFESOR") REFERENCES PROFES ("CODIGO")

también puedes utilizar la "propagación" de la acción en la cláusula FOREIGN KEY ...

Código:

FOREIGN KEY ("PROFESOR") REFERENCES PROFES ("CODIGO") ON DELETE CASCADE
y así evitas el uso de triggers (al menos explícitamente).

Saludos.

Tomás 06-05-2003 19:51:24

Me sigue dando el mismo error:

Dynamic SQL Error
SQL error code = -104
Unexpected end of command
Statement: CREATE TRIGGER PROFES_BD0 FOR PROFES
ACTIVE BEFORE DELETE POSITION 0
AS
begin
delete from faltas a where a.profesor = old.codigo

¿Qué significa la a [faltas a where a.profesor] ?

Utilizdo IBConsole.

Un saludo. Tomás.

maeyanes 06-05-2003 19:54:10

Yo te recomendaría que lo hagas como indica kinobi...

Es una forma rápida de reproducir el comportamiento que deseas...

Saludos...

Tomás 06-05-2003 20:34:57

Muchas gracias, kinobi, he añadido ON DELETE CASCADE y funciona perfectamente.

Un saludo. Tomás.

kinobi 06-05-2003 21:00:56

Hola,

solamente apuntar que la solución dada por Cadetill además de válida, es también lo que hace internamente el motor relacional del servidor al encontrarse la cláusula FOREIGN KEY ... ON DELETE ...

La integridad referencial declarativa simplifica la tarea en cuanto a la codificación de los fuentes, pero la tarea sigue siendo la misma.

Por cierto, y volviendo al error que te daba en la creación del trigger: es un problema con los finalizadores de sentencia ... para otra ocasión (con triggers y procedimientos almacenados) échale un vistazo a la sentencia SET TERM ..., la necesitarás.

Saludos.


La franja horaria es GMT +2. Ahora son las 02:04:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi