Un de vos DBA, ou un de vos développeurs créant des procédures stockées est parti, et vous souhaitez supprimer son compte MySQL pour garder un référentiel d’utilisateurs propre. C’est une bonne idée, mais attention tout de même à certains éléments liés à la sécurité des procédures stockées : definer et SQL Security Invoker histoire d’éviter toute mauvaise surprise.

Lorsque vous jouez une procédure stockée sur votre serveur de base de données, le compte qui sert à créer la dite procédure est utilisé comme « definer ». Si vous exportez la procédure de votre serveur, votre procédure devrait commencer par l’instruction suivante :


CREATE definer = 'toto@localhost' PROCEDURE

Cela peut poser problème, car si un compte nominatif a été utilisé pour jouer la procédure, le jour où vous supprimez le compte en question votre procédure ne s’exécutera plus. Et vous aurez des messages comme « The user specified as a definer (toto@localhost) does not exist ».

Pour contourner le problème, plusieurs solutions s’offrent à vous :

  • utiliser SQL SECURITY INVOKER dans vos procédures. Cette instruction déporte la sécurité de l’exécution non pas au compte qui a créé la procédure (definer), mais au compte qui l’exécute. C’est une bonne méthode pour résoudre ce problème en particulier mais également pour gérer la sécurité de vos procédures.
  • utiliser un compte non nominatif pour jouer les procédures, ce compte devant disposer des privilèges suffisants pour créer et exécuter la procédure.
  • Mettre à jour à posteriori les definer, mais c’est déconseillé car cela vous oblige à mettre à jour la table système mysql.proc.

La deuxième solution est intéressante, par contre il faut de la rigueur pour ne créer les procédures que via le compte qui permet de le faire. Un bon réglage des privilèges permettra de régler ce problème. La première solution réglera le souci d’exécution, par contre si vous remontez un dump vous pourrez être confronté à un problème si le definer n’existe plus.