2010-04-19 26 views
17

he escrito todos los procedimientos de MySQL como [email protected]:¿Se requiere `definer` cuando se crea un procedimiento almacenado?

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

El problema es que, cuando se despliega a otro servidor, tengo que sustituir con root usuario actual y reemplazarlo con localhost IP actual, lo cual es molesto.

¿Hay alguna manera de escribir procedimientos para que alguien que quiera usar mi base de datos y procedimientos no tenga que modificar el definidor de cada procedimiento?

Respuesta

13

Como se indica en la documentación de MySQL here

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

Por lo tanto, la parte DEFINER no es obligatoria, basta con crear PROCEDIMIENTO debería funcionar.

+0

Dice: "La cláusula DEFINER determina el contexto de seguridad que se utiliza para verificar los privilegios de acceso en el momento de activación del activador Más detalle se da más adelante en esta sección.". Entonces, cuando me aseguro de que los procedimientos solo los usen los usuarios con privilegios, ¿puedo eliminar totalmente las cosas definidas? – Xorty

+0

Sí, supongo. Creo que cuando defines los permisos del usuario hay un privilegio de "ejecutar procedimientos" que se puede conceder/denegar (no estoy seguro de eso ...) – maid450

+0

Bueno, lo intentaré más tarde y responderé si funcionó. Gracias – Xorty

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

Check it .. Probablemente esto le ayudará, si se quiere definir el usuario en su procedimiento ...

+2

¿Es posible que explique el atributo DEFINER? % significa: ¿permite a cualquier usuario desde cualquier dirección IP? Pls. contestame. Estoy usando el host compartido GoDaddy en el que DEFINER se crea automáticamente y no podemos eliminarlo. se menciona como DEFINER = [databasename] @% pero no me permite comunicar el procedimiento almacenado desde la aplicación local de Windows; pero puedo comunicarme si utilizo la consulta normal (como: seleccione * de tablenm ...) ¿Alguien puede ayudarme en este sentido? Por favor. – Sensa

0

Puede especificar privilegios de ejecución mediante la adición de la siguiente declaración en el cuerpo del procedimiento (después de Declaración):

SQL SECURITY INVOKER 

Ejemplo:

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

Si lo hace, el actual invocador p se aplican los privilegios y se omite la parte DEFINER (incluso cuando se agrega automáticamente durante la importación del esquema). referencia completa aquí: https://dev.mysql.com/doc/refman/5.7/en/stored-programs-security.html

Cuestiones relacionadas