PDA

Ver la Versión Completa : Trigger ... error al crear


Tomás
06-05-2003, 17:44:11
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


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
Hola,

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 ...


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.