权限被拒绝的MySQL Outfile

时间:2018-12-06 20:45:06

标签: mysql

我试图理解在执行MySQL过程时调用了哪个用户,因为我的过程尝试创建文件,但是由于权限问题而无法创建文件。

这是我的程序:

CREATE PROCEDURE `EXPORT_TEST`()
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY INVOKER
COMMENT ''
BEGIN

DECLARE VAR_INS INT(10);
DECLARE VAR_DT_DEBUT DATETIME;


SET VAR_DT_DEBUT = CURRENT_TIMESTAMP;

INSERT INTO BC_ALIM (NOM_TABLE, DATE_DEBUT)
  VALUES('EXPORT_TEST', VAR_DT_DEBUT);

BEGIN

SELECT * INTO OUTFILE '/home/bureau/IMPORTS/fichierSortie3.csv'
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
FROM db_baby_concept.BC_TYPE_LIVRAISON;
END;
END

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

MySQL存储过程具有SQL SECURITY特性,它指定运行过程代码的安全联系人。可以是DEFINERINVOKER,默认值为DEFINER。因此,当您运行存储过程时,它会在定义该过程的用户的权限下执行;如果他们没有FILE特权,将无法创建文件。

您可以将过程的安全性设置为INVOKER。然后它将使用您的权限,而不是创建者的权限。

CREATE PROCEDURE procName()
SQL SECURITY INVOKER
BEGIN 
    ...
END;

此外,文件是由MySQL服务器进程编写的,因此用于服务器的Linux用户ID需要对包含该文件的目录具有写权限。因此,您可能需要使IMPORTS目录可写。而且,如果设置了secure_file_priv系统变量,则只能写入在那里命名的目录。