MariaDB - mizející názvy proměných rubrika: Databáze: SQL

3 Fos4
položil/-a 14.5.2021
 
upravil/-a 14.5.2021

Ahoj, přešli jsme z MySQL na MariaDB a nyní jsem si všiml zajímavého chování. Pokud proměnná (v DECLARE) začíná podtržítkem, tak po uložení se název této promněné nezobrazí..

Například trigger:

BEGIN
  DECLARE _test ENUM('0', '1') DEFAULT NULL;
  INSERT INTO test (colA) VALUES (_test);
END

Se po uložení zobrazí jako:

BEGIN
  DECLARE ENUM('0', '1') DEFAULT NULL;
  INSERT INTO test (colA) VALUES ();
END

Editace existující procedury tak vlastně moc nejde a člověk musí stále dokola psát znovu a znovu ty promněné (ano je možné nepsat ty podtržítka, ale u nás to je konvence použít podtržíko na lokální promněné, ať není kolize se sloupcem).

Trigger (i procedura, funkce apod.) normálně fungují ale promněné s podtržítkem se nezobrazují.. i v information_schema to chybí. Jedině jak si to zobrazit správně je skrze SHOW CREATE ....

Nesetkal se s tím někdo? Verze MariaDB je 10.5.9 a opravdu špatně se s tím pracuje :-(

PS: případně začneme používat $, ten funguje a je povolen..

odkaz Vyřešeno
3 Fos4
odpověděl/-a 14.5.2021
 
upravil/-a 14.5.2021

Tak jsem to vyřešil náhradou za $, kdo by chtěl skript na hromadnou změnu tak zasílám níže (bez záruky :) ) pro procedury/funkce. Pro trigger to je obdobné:

  $q = "
    SELECT
      ROUTINE_NAME AS name,
      ROUTINE_TYPE AS type
    FROM information_schema.ROUTINES 
    WHERE 1
      AND ROUTINE_CATALOG = 'def'
      AND ROUTINE_SCHEMA = DATABASE()
  ";
  $routines = $this->db->query($q)->fetchAll();
 
  foreach($routines as $routine) {
    $q = "SHOW CREATE %SQL %n";
    $create = $this->db->query($q, $routine['type'], $routine['name'])->fetch();
 
    $createKey = "Create ".ucfirst(strtolower($routine['type']));
    $body = $create[$createKey];
 
    $matches = [];
    if(!preg_match_all('~DECLARE\s+(_[^\s]+)~i', $body, $matches)) {
      continue;
    }
 
    $variables = array_unique($matches[1]);
 
    if(!count($variables)) {
      continue;
    }
 
    foreach($variables as $variable) {
      $body = str_ireplace($variable, "\$".substr($variable, 1), $body);
    }
 
    $q = "DROP %SQL %n";
    $this->db->query($q, $routine['type'], $routine['name']);
    $this->db->query($body);
  }

Pro zobrazení všech 2 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.