FILE привилегия для сеанса / пользователя MySQL

Когда кто-то зарегистрирован в моей базе данных MySQL, эта функция должна работать:

mysql_query("SELECT mail FROM users INTO OUTFILE 'test.txt'"); 

Но я получаю ошибку

Доступ запрещен для пользователя 'registerdb' @ '%' (с использованием пароля: YES)

Итак, как я предоставляю разрешение FILE на сеанс / пользователь?

Chek для разрешений этого пользователя:

SHOW GRANTS ДЛЯ 'registerdb' @ '%'

Если в списке отсутствует разрешение FILE, просто добавьте его:

ГРАНТ ФАЙЛ . to 'registerdb' @ '%'

а потом:

ПРИВИЛЕГИИ ФЛЮЗА;

Но остерегайтесь, предоставляя разрешение FILE на *.* Вы по существу предоставляете этому пользователю полный доступ к любому файлу сервера .

Чтобы ограничить ограничение местоположения, в котором файлы могут быть прочитаны и записаны, установите систему secure_file_priv в определенный каталог .

Сначала вам нужно удалить файл за пределами MySQL, в MySQL нет функции, которая может удалить или перезаписать файл.
Это мера безопасности, и вы должны быть благодарны за этот факт.

Обратите внимание, что может быть сложно определить, где именно MySQL хранит свои файлы.

Обычно я использую

 LOAD DATA INFILE 'nonexistingfile' INTO validtable 

Ошибка, которая генерирует, дает вам полный путь для текущей базы данных, в SELECT ... INTO OUTFILE будет записываться SELECT ... INTO OUTFILE .
Вы можете использовать различные способы удаления (или улучшения перемещения) файла, на cron-job приходит cron-job .
Вы даже можете написать пользовательский UDF, который сделает удаление для вас, хотя это угроза безопасности мэра и программисты, которые делают это, заслуживают судьбу хуже чем-то ужасного.

Другой вариант – сделать

 START TRANSACTION; SELECT @today:= CURDATE(); INSERT INTO saved_mail_log (filename, whensaved, user_id) VALUES (CONCAT(@today,'mailsave.csv'), @today, '1234'); SELECT mail FROM users WHERE user_id = '1234' INTO OUTFILE CONCAT(@today,'mailsave.csv'); COMMIT; 

Я не уверен на 100%, что вы можете использовать функцию для создания параметра OUTFILE , если вам не нужно будет выбирать это значение и вводить его в запрос с использованием динамического SQL.

Вы можете получить последний файл, используя:

 SELECT * FROM saved_mail_log WHERE user_id = '1234' ORDER BY whensaved DESC LIMIT 1