2012-09-26 65 views
5

Tôi có một bảng:Làm thế nào để xóa các tệp khi một bản ghi bị xóa?

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

Khi một dòng từ bảng này sẽ bị xóa, các tập tin được tham chiếu bởi nó sẽ bị xóa theo. Có hai trường hợp khi hồ sơ bị xóa khỏi bảng này:

  1. Người dùng xóa một ảnh cụ thể.
  2. Người dùng xóa một đối tượng thuộc tính cụ thể (như trong "thuộc tính bất động sản") và tất cả các ảnh đề cập đến thuộc tính đó sẽ bị xóa tự động bởi ON DELETE CASCADE.

Tôi biết tôi có thể chọn tất cả ảnh được tham chiếu trong cơ sở dữ liệu trước khi xóa thuộc tính và xóa chúng cùng với tệp của từng người một, nhưng tôi đang tìm giải pháp thay thế. Có thể nắm bắt thời điểm khi một bản ghi trong bảng photo bị xóa và xóa tệp tự động mà không từ bỏ điều khoản CASCADE, có thể bằng cách kích hoạt bằng cách nào đó?

+0

Trình kích hoạt có thể thực hiện tác vụ trên DB trong thời điểm 'xóa'. Nhưng đối với việc xóa tệp bên ngoài DB, bạn phải tự làm điều đó. –

+0

Tôi không nghĩ rằng điều đó là có thể. cùng một vấn đề đã được nêu ra [ở đây] (http://stackoverflow.com/questions/6527514/delete-file-using-mysql-procedure) – HichemSeeSharp

+2

Có thể có một máng người dùng định nghĩa hàm gọi là sys_exec, nhưng tôi sẽ không khuyên bạn nên sử dụng nó. Bạn nên kiểm soát hành vi này trough ngôn ngữ mà làm cho ứng dụng của bạn chạy, cơ sở dữ liệu chỉ nên xử lý dữ liệu của nó, không phải các tập tin là tốt. –

Trả lời

8

Bạn đang tìm kiếm DELETE TRIGGER. Xem here cho một vấn đề tương tự như & Giải pháp. Có thể thực hiện hành động bên ngoài thông qua cài đặt sys_exec.

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

Và nếu xóa là một giao dịch, điều gì sẽ xảy ra? Tôi không thể phục hồi các tệp nếu tôi phải khôi phục. Và các giao dịch sẽ thất bại, nếu việc xóa tệp có vấn đề? - Nói các vấn đề về quyền. –

Các vấn đề liên quan