Ładowanie danych z pliku do tabeli – procedurą składowaną

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.

Dodaj komentarz