2012-09-26 23 views
5

私はテーブルを持っている:このテーブルから行が削除されるとレコードが削除されたときにファイルを削除する方法は?

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 
); 

、それによって参照されるファイルも削除されるべきです。レコードがこのテーブルから削除される2つのシナリオがあります。

  1. ユーザーが1つの特定の写真を削除します。
  2. ユーザーは特定のプロパティオブジェクト(「不動産プロパティ」など)を削除し、そのプロパティを参照するすべての写真は自動的にON DELETE CASCADEで削除されます。

私は、プロパティを削除する前にデータベース内の参照されているすべての写真を選択し、ファイルごとに1つずつ削除することができますが、代わりの解決策を探しています。 photoテーブルのレコードが削除された瞬間をキャッチして、CASCADE句を辞めることなく、ファイルを自動的に削除することは可能でしょうか?

+0

トリガーは、「削除」の時点でDBに対してアクションを実行できます。しかし、DBの外でファイルを削除するには、それを自分で行う必要があります。 –

+0

私はそれが可能ではないと思います。同じ問題が発生しました[ここ](0stackoverflow.com/questions/6527514/delete-file-using-mysql-procedure) – HichemSeeSharp

+2

これは、sys_execと呼ばれるユーザ定義の関数によって可能ですが、私はそれをお勧めしません。あなたのアプリケーションを実行させる言語を介してこの動作を制御する必要があります、データベースだけでなく、ファイルを処理する必要があります。 –

答えて

8

あなたはDELETE TRIGGERを探しています。同様の問題&解決策については、hereを参照してください。外部アクションは、sys_execのインストールによって実現できます。

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

削除がトランザクションの場合、どうなりますか?ロールバックする必要がある場合、ファイルの復元を実行できません。ファイルの削除に問題がある場合、トランザクションは失敗しますか? - 許可の問題があります。 –

関連する問題