Zakładamy że
- zainstalowane jest biblioteka mysqludf
- skrypt sh zawiera instrukcję ładowania, którą wykonalibyśmy ręcznie
- user (mysql)
- jest właścicielem skryptu
- u+x
- user (john) umieszczony w skrypcie
- ma dostęp do tabeli do której dane będą importowane
- ma uprawnienia CALL
Plik importu CSV – wartości rozdzielone średnikami (zapisanie pliku Excell jako CSV UTF-8 rozdzielony przecinkami)
/var/www/projekt/webroot/files/raport.csv
Skrypt /var/www/projekt/import_script.sh
#!/bin/sh /usr/bin/mysql -u john -p'Hasło' -e 'LOAD DATA LOCAL INFILE "/var/www/projekt/webroot/files/raport.csv" INTO TABLE import_table FIELDS TERMINATED BY ";" LINES TERMINATED BY "\n" IGNORE 1 LINES (name, [...lista kolejnych pól]);' mojabaza
# chown mysql.mysql import_script.sh # chmod u+x import_script.sh
Uprawnienia do bazy dla użytkownika, który będzie uruchamiał procedurę
> GRANT ALL ON mojabaza.import_table TO john@localhost;
Procedura import_data_SP()
DELIMITER $$ CREATE PROCEDURE load_data_SP () BEGIN DECLARE ret_val int; SET ret_val = sys_exec('/var/www/html/project/import_script.sh'); IF ret_val=0 THEN SELECT 'OK' as Result; ELSE SELECT ret_val AS Result; END IF; END $$ DELIMITER ;
Uprawnienia dla użytkownika który będzie ładował do tabeli
> GRANT EXECUTE ON PROCEDURE mojabaza.load_data_SP to john@localhost;
Uruchomienie procedury w MySQL
> CALL load_data_SP();
Uruchomienie procedury w CakePHP 3
public function loadDataSp() { if ($this->request->is(['patch', 'post', 'put'])) { $connection = \Cake\Datasource\ConnectionManager::get('john'); $result = $connection->execute('CALL load_data_SP()'); $this->unlinkFile(); return $this->redirect(['action' => 'index']); } }
Połączenie 'john’ jest zdefiniowane w app.php – dostęp do tabeli dla użytkownika john, który może uruchomić skrypt. Nie należy dawać mu uprawnień do wszystkich tabel.