web-dev-qa-db-fra.com

Est-ce que `definer` est requis lors de la création d'une procédure stockée?

J'ai écrit toutes les procédures MySQL sous la forme root@localhost:

CREATE DEFINER=`root`@`localhost` PROCEDURE `p_add_user`(...)

Le problème est que, lors du déploiement sur un autre serveur, je dois remplacer root par l'utilisateur actuel et remplacer localhost par l'adresse IP actuelle, ce qui est gênant.

Existe-t-il un moyen d'écrire des procédures pour que quelqu'un qui souhaite utiliser ma base de données et mes procédures n'ait pas à modifier le créateur de chaque procédure?

23
Xorty

Comme indiqué dans la documentation MySQL ici

CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body

La partie DEFINER n’est donc pas obligatoire, mais CREATE PROCEDURE devrait fonctionner.

17
maid450
CREATE DEFINER=[your_web_user]@% PROCEDURE p_add_user(...)

Vérifiez-le .. probablement cela vous aidera si vous voulez définir l'utilisateur dans votre procédure ...

Vous pouvez spécifier des privilèges d'exécution en ajoutant l'instruction suivante dans le corps de la procédure (après la déclaration): 

SQL SECURITY INVOKER

Exemple:

CREATE DEFINER=`root`@`localhost` PROCEDURE `p_add_user`()
SQL SECURITY INVOKER
(...)

Ce faisant, les privilèges d’invocation réels sont appliqués et la partie DEFINER est omise (même si elle est ajoutée automatiquement lors de l’importation du schéma) . Référence complète ici: https://dev.mysql.com/ doc/refman/5.7/en/storage-programmes-security.html

0
MonkeyFeeder