La fonction
sql_alter()
permet d’envoyer une requête de type
ALTER
au serveur de base de données pour modifier la structure de la base.
La fonction a 3 paramètres :
-#
$q
est la requête (sans le terme "ALTER") a effectuer
-#
$serveur
,
-#
$option
{{Note :}} Cette fonction prenant directement une requête au format SQL, il est prudent de bien respecter les standards SQL. Il est possible que pour des prochaines versions de SPIP, le paramètre
$q
accepte un tableau plus structuré en entrée pour faciliter les différents portages.
La fonction s’utilise comme suit :
sql_alter("TABLE table ADD COLUMN colonne INT");
sql_alter("TABLE table ADD colonne INT"); // COLUMN est optionnel
sql_alter("TABLE table CHANGE colonne colonne INT DEFAUT '0'");
sql_alter("TABLE table ADD INDEX colonne (colonne)");
sql_alter("TABLE table DROP INDEX colonne");
sql_alter("TABLE table DROP COLUMN colonne");
sql_alter("TABLE table DROP colonne"); // COLUMN est optionnel
sql_alter("TABLE spip_tradlang RENAME spip_tradlangs");
// possibilite de passer plusieurs actions, mais attention aux portages :
sql_alter("TABLE table DROP colonneA, DROP colonneB");
La fonction
sql_alter()
sert particulièrement lors de la phase de mise à jour de plugins dans les fonctions
{nom}_upgrade()
des différents plugins.
Exemple
Ajouter une colonne « composition » sur la table
spip_articles
(plugin « Composition ») :
sql_alter("TABLE spip_articles ADD composition varchar(255) DEFAULT '' NOT NULL");
Ajouter une colonne « css » sur la table « spip_menus » (plugin « Menus ») :
sql_alter("TABLE spip_menus ADD COLUMN css tinytext DEFAULT '' NOT NULL");
Le plugin « TradRub » dans sa procédure d’installation ajoute une colonne « id_trad » sur la table
spip_rubriques
en utilisant la fonction
maj_tables()
prévue, puis ajoute un index sur cette même colonne avec
sql_alter()
:
function tradrub_upgrade($nom_meta_base_version, $version_cible){
$current_version = 0.0;
if ( (!isset($GLOBALS['meta'][$nom_meta_base_version]) )
|| (($current_version = $GLOBALS['meta'][$nom_meta_base_version]) != $version_cible))
{
include_spip('base/tradrub');
if ($current_version==0.0){
include_spip('base/create');
maj_tables('spip_rubriques');
// index sur le nouveau champ
sql_alter("TABLE spip_rubriques ADD INDEX (id_trad)");
ecrire_meta($nom_meta_base_version, $current_version=$version_cible, 'non');
}
}
}