2010-04-19 3 views
17

J'ai écrit toutes les procédures MySQL comme [email protected]:Est-ce que `definer` est requis lors de la création d'une procédure stockée?

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

Le problème est, lors du déploiement sur un autre serveur, je dois remplacer root avec l'utilisateur en cours et remplacer localhost avec IP en cours, ce qui est gênant.

Est-il possible d'écrire des procédures pour que quelqu'un qui veut utiliser ma base de données et mes procédures n'ait pas à modifier le définisseur de chaque procédure?

Répondre

13

Comme il est indiqué dans la documentation MySQL here

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

Ainsi, la partie DEFINER n'est pas obligatoire, il suffit de créer PROCEDURE devrait fonctionner.

+0

Il est écrit "La clause DEFINER détermine le contexte de sécurité à utiliser lors de la vérification des privilèges d'accès au moment de l'activation du déclencheur." Plus de détails sont donnés plus loin dans cette section. " Alors, quand je m'en assurerai, les procédures ne sont utilisées que par des utilisateurs privilégiés, je peux totalement supprimer des choses définitives entières? – Xorty

+0

Oui, je suppose. Je pense que lorsque vous définissez les permissions de l'utilisateur il y a un privilège "execute procedures" qui peut être accordé/refusé (pas sûr de ça ...) – maid450

+0

Bon, je vais essayer plus tard et répondre si ça a marché. Thanx – Xorty

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

Check it .. probablement cela vous aidera, si vous voulez définir l'utilisateur dans votre procédure ...

+2

Est-il possible pour vous d'expliquer l'attribut DEFINER? % signifie - il permet à n'importe quel utilisateur de n'importe quelle adresse IP? Pls. réponds moi. J'utilise un hôte partagé godaddy dans lequel DEFINER est créé automatiquement et nous ne pouvons pas le supprimer. son mentionné comme DEFINER = [nom_basededonnées] @% mais il ne me permet pas de communiquer la procédure stockée à partir de l'application Windows locale; mais je peux pouvoir communiquer si j'utilise la requête normale (comme: sélectionnez * from tablenm ...) Quelqu'un peut-il m'aider à cet égard - s'il vous plaît. – Sensa

0

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

SQL SECURITY INVOKER 

Exemple:

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

Ce faisant, l'invocateur réelle p les variables sont appliquées 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/stored-programs-security.html

Questions connexes