MariaDB - mizející názvy proměných rubrika: Databáze: SQL
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..
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:
Nebo se přihlaste jménem a heslem: