2012-09-26 15 views
5

Tengo una tabla:¿Cómo eliminar archivos cuando se borra un registro?

CREATE TABLE photo (
    photo_id BIGINT NOT NULL AUTO_INCREMENT, 
    property_id BIGINT NOT NULL, 
    filename VARCHAR (50) NOT NULL; 
    ... 
    PRIMARY KEY (photo_id), 
    CONSTRAINT photo_fk_property FOREIGN KEY (property_id) 
     REFERENCES property (property_id) 
     ON DELETE CASCADE 
); 

Cuando se elimina una fila de esta tabla, el archivo al que hace referencia debe suprimirse también. Hay dos escenarios cuando los registros se eliminan de esta tabla:

  1. El usuario elimina una fotografía en particular.
  2. El usuario elimina un objeto de propiedad particular (como en "propiedad inmobiliaria"), y todas las fotos que hacen referencia a esa propiedad se eliminan automáticamente por ON DELETE CASCADE.

Sé que puedo seleccionar todas las fotos a las que se hace referencia en la base de datos antes de eliminar una propiedad y eliminarlas junto con sus archivos uno por uno, pero estoy buscando una solución alternativa. ¿Es posible detectar el momento en que se elimina un registro en la tabla photo y eliminar el archivo automáticamente, sin renunciar a la cláusula CASCADE, de alguna manera?

+0

Un disparador puede realizar acciones en la base de datos en el momento de una 'eliminación'. Pero para eliminar archivos fuera de la base de datos, debe hacerlo usted mismo. –

+0

No creo que eso sea posible. el mismo problema se planteó [aquí] (http://stackoverflow.com/questions/6527514/delete-file-using-mysql-procedure) – HichemSeeSharp

+2

Es posible a través de una función definida por el usuario llamada sys_exec, pero no lo recomendaría. Debe controlar este comportamiento a través del idioma que hace que su aplicación se ejecute, la base de datos solo debe manejar sus datos, no los archivos también. –

Respuesta

8

Está buscando DELETE TRIGGER. Consulte here para obtener una solución similar al problema &. Se puede lograr una acción externa mediante la instalación de sys_exec.

CREATE TRIGGER foobar 
AFTER DELETE ON photo 
FOR EACH ROW 
BEGIN 
    CALL sys_exec(concat('/bin/rm -f ',filename)); 
END 
+2

Y si la eliminación fuera una transacción, ¿qué pasaría? No puedo recuperar archivos si tengo que retroceder. ¿Y las transacciones fallarán, si la eliminación del archivo tiene un problema? - Di problemas de permiso. –

Cuestiones relacionadas