CREATE TABLE file (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, path VARCHAR(100) NOT NULL); GRANT SELECT, INSERT, UPDATE ON file TO user; GRANT FILE ON *.* TO user;
在上面的代码中,大家创建了一个名为”file”的表,该表存储有关已上传文件的信息,并向用户授予了选择,插入和更新文件表中数据的权限。此外,大家还授予了用户在所有数据库中使用FILE的权限。
DELIMITER // CREATE TRIGGER delete_file_trigger BEFORE DELETE ON file FOR EACH ROW BEGIN SET @fname = old.name; SET @fpath = old.path; SET @pattern = CONCAT('^', @fpath, '/', @fname, '$'); SET @result = (SELECT COUNT(*) FROM information_schema.processlist WHERE info REGEXP @pattern); IF @result >0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot delete file being processed'; END IF; END // DELIMITER ;
这是一个触发器,大家将在执行DELETE语句时自动触发。当大家尝试删除正在进程中的文件时,触发器中的代码将检查该文件是否正在被另一个会话使用。如果是,则会生成一个SQLSTATE异常,通知用户无法删除该文件。
通过限制删除文件的能力,大家可以确保不会意外删除正在使用的文件。这是MySQL管理文件时安全的好方法。