MySQL - Problema con procedimiento almacenado

 
Vista:
sin imagen de perfil

Problema con procedimiento almacenado

Publicado por Jean-Jacques (3 intervenciones) el 13/03/2015 12:58:02
Saludos, comunidad.

Estoy empezando con programación, y concretamento en lenguaje MySQL. Mi intención es construir un Procedimiento almacenado que me permita eliminar un par de usuario a la vez pasando cuatro parámetros (NombreUsuario1, EquipoHost1 y NombreUsuario2, EquipoHost2). Nada especialmente útil, simplemente es un ejercicio. El problema es que no llega a ejecutarse la tercera condicional que interpretaría el vacío del segundo Host como el comodín %, y me cuesta entender el fallo porque no he dado mucha programación todavía.

La primera condición, que verifica si los dos nombres están vacíos, funciona y muestra el mensaje correspondiente. La segunda condición, que verifica si el parámetro nombre del primer usuario está vacío y el segundo nombre tiene dato, también. Como digo, el problema está en la tercera condicional, que comprueba si el host de la segunda cuenta está vacío para sustituírlo por %. ¿Alguien puede ayudarme a solvertar este problema?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/* Si el parámetro del nombre de usuario de las dos cuentas no contiene datos, es decir, no se proporcionaron ninguno de los dos nombres de usuario, el procedimiento no realizará ninguna acción, mostrará una advertencia y finalizará su ejecución. */
 
   IF STRCMP(NombreUsuario1,'') = 0 AND STRCMP(NombreUsuario2,'') = 0 THEN
      SELECT 'No se han introducido nombres para las cuentas de usuario. Introduce los nombres e inténtalo de nuevo.';
   END IF;
 
   /* Si el primer nombre de usuario no tiene dato, se tratará la segunda cuenta */
   IF STRCMP(NombreUsuario1,'') = 0 AND STRCMP(NombreUsuario2,'') = 1 THEN
      SELECT 'No se ha introducido nombre para la primera cuenta de usuario. Intentará eliminarse la segunda.';
      	 SET @Sentencia=CONCAT('DROP USER "'  ,NombreUsuario2,'"@"',EquipoHost2,'"');
 
	  PREPARE Sentencia FROM @Sentencia;
          EXECUTE Sentencia;
          DEALLOCATE PREPARE Sentencia;
          SELECT 'El usuario "',NombreUsuario2 ,'" con host "', EquipoHost2,'" fue eliminado con éxito.';
 
 
 
	  	   /* Si el host de la segunda cuenta está vacío se interpretará como un % */
   		   IF STRCMP(NombreUsuario1,'') = 0 AND STRCMP(NombreUsuario2,'') = 1 AND STRCMP(EquipoHost2,'') = 0 THEN
      		       SELECT 'No se ha introducido nombre para la primera cuenta de usuario. Intentará eliminarse la segunda.';
      	 	       	  SET @Sentencia=CONCAT('DROP USER "'  ,NombreUsuario2,'"@"','"%"');
 
			PREPARE Sentencia FROM @Sentencia;
          		EXECUTE Sentencia;
          		DEALLOCATE PREPARE Sentencia;
          		SELECT 'El usuario "',NombreUsuario2 ,'" con host "%" fue eliminado con éxito.';
 
   		    END IF;
 
 
   END IF;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Problema con procedimiento almacenado

Publicado por Jean-Jacques (3 intervenciones) el 14/03/2015 14:17:00
Ya lo solucioné por mí mismo. Es una pena que nadie haya propuesto ninguna solución sencilla. Supongo que estáis muy ocupados. Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 796
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Problema con procedimiento almacenado

Publicado por xve (1151 intervenciones) el 14/03/2015 19:59:22
Hola Jean, nos puedes mostrar como lo has solucionado?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema con procedimiento almacenado

Publicado por Jean-Jacques (3 intervenciones) el 14/03/2015 20:09:35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
DELIMITER $$
CREATE DATABASE IF NOT EXISTS Plantillas $$
USE Plantillas $$
DROP PROCEDURE IF EXISTS Plantillas.BorrarUsuario $$
CREATE DEFINER='root'@'localhost' PROCEDURE Plantillas.BorrarUsuario(IN NombreUsuario1 VARCHAR(20), IN EquipoHost1 VARCHAR(35),  NombreUsuario2 VARCHAR(20), IN EquipoHost2 VARCHAR(35))
DETERMINISTIC
LANGUAGE SQL
COMMENT 'Procedimiento que elimina 2 cuentas de usuario.'
SQL SECURITY DEFINER
 
BEGIN
 
 
 
    /* Declaramos las variables que almacenarán los resultados de las consultas Select de las cuentas de usuarios */
    DECLARE var1 INT;
    DECLARE var2 INT;
    DECLARE var3 INT;
    DECLARE var4 INT;
 
 
 
 
/* Si el parámetro del nombre de usuario de las dos cuentas no contiene datos, es decir, no se proporcionaron ninguno de los dos nombres de usuario, el procedimiento no realizará ninguna acción, mostrará una advertencia y finalizará su ejecución. */
 
   IF STRCMP(NombreUsuario1,'') = 0 AND STRCMP(NombreUsuario2,'') = 0 THEN
      SELECT 'No se han introducido nombres para las cuentas de usuario. Introduce los nombres e inténtalo de nuevo.';
   END IF;
 
 
 
 
    	     /******** Asignamos valores a las variables  ********/
 
    /* Comprobamos si la 1ª cuenta existe para crearla o no */
    SET var1 = (SELECT count(User) FROM mysql.user WHERE User=NombreUsuario1 AND Host=EquipoHost1);
 
 
    /* Si no especificamos Host a la primera cuenta, comprobamos si el usuario tiene una cuenta con el comodín '%' para todos los hosts */
    SET var2 = (SELECT count(User) FROM mysql.user WHERE User=NombreUsuario1 AND Host='%');
 
 
    /* Comprobamos si la 2ª cuenta existe para crearla o no */
    SET var3 = (SELECT count(User) FROM mysql.user WHERE User=NombreUsuario2 AND Host=EquipoHost2);
 
 
    /* Si no especificamos Host a la 2ª cuenta, comprobamos si el usuario tiene una cuenta con el comodín '%' para todos los hosts */
    SET var4 = (SELECT count(User) FROM mysql.user WHERE User=NombreUsuario2 AND Host='%');
 
 
 
 
 
    	     /******** Cuenta de usuario #1  ********/
 
    /* Si el usuario 1 existe, informamos de ello y borramos. */
    IF var1 = 1 THEN
		SELECT 'La PRIMERA CUENTA DE USUARIO existe y se borrará.';
             	 SET @Sentencia=CONCAT('DROP USER "'  ,NombreUsuario1,'"@"',EquipoHost1,'"');
		 SET @Sentencia2=CONCAT('SHOW GRANTS FOR "'  ,NombreUsuario1,'"@"',EquipoHost1,'"');
	  SELECT 'El usuario "',NombreUsuario1 ,'" con host "', EquipoHost1,'" posee los siguientes privilegios:';
	  PREPARE Sentencia2 FROM @Sentencia2;
          EXECUTE Sentencia2;
          DEALLOCATE PREPARE Sentencia2;
 
	  PREPARE Sentencia FROM @Sentencia;
          EXECUTE Sentencia;
          DEALLOCATE PREPARE Sentencia;
          SELECT 'El usuario "',NombreUsuario1 ,'" con host "', EquipoHost1,'" fue eliminado con éxito.';
 
	  ELSE
	  SELECT 'La PRIMERA CUENTA DE USUARIO no existe';
 
    END IF;
 
 
    /* Si en host1 no se ha pasado ningún dato entonces se borra la 1ª cuenta estableciendo el host como '%'. */
 
     IF  var2 = 1 AND NombreUsuario1 !='' AND EquipoHost1='' THEN
     	 SELECT 'La PRIMERA CUENTA DE USUARIO con host "%", existe y se borrará.';
	  SET @Sentencia=CONCAT('DROP USER "'  ,NombreUsuario1,'"@"','%"');
	  SET @Sentencia3=CONCAT('SHOW GRANTS FOR "'  ,NombreUsuario1,'"@"','%"');
 
	  SELECT 'El usuario "',NombreUsuario1 ,'" con host "%"', ' posee los siguientes privilegios:';
	  PREPARE Sentencia3 FROM @Sentencia3;
          EXECUTE Sentencia3;
          DEALLOCATE PREPARE Sentencia3;
 
	  PREPARE Sentencia FROM @Sentencia;
          EXECUTE Sentencia;
          DEALLOCATE PREPARE Sentencia;
          SELECT 'El usuario "',NombreUsuario1 ,'" con host "%"', ' fue eliminado con éxito.';
 
	  ELSE
	  SELECT 'La PRIMERA CUENTA DE USUARIO (con host %) no existe';
 
     END IF;
 
 
 
 
 
    	     /******** Cuenta de usuario #2  ********/
 
    /* Si el usuario 2 existe, informamos de ello y borramos. */
    IF var3 = 1 THEN
		SELECT 'LA SEGUNDA CUENTA DE USUARIO existe y se borrará.';
             	 SET @Sentencia=CONCAT('DROP USER "'  ,NombreUsuario2,'"@"',EquipoHost2,'"');
		 SET @Sentencia4=CONCAT('SHOW GRANTS FOR "'  ,NombreUsuario2,'"@"',EquipoHost2,'"');
	  SELECT 'El usuario "',NombreUsuario2 ,'" con host "', EquipoHost2,'" posee los siguientes privilegios:';
	  PREPARE Sentencia4 FROM @Sentencia4;
          EXECUTE Sentencia4;
          DEALLOCATE PREPARE Sentencia4;
 
	  PREPARE Sentencia FROM @Sentencia;
          EXECUTE Sentencia;
          DEALLOCATE PREPARE Sentencia;
          SELECT 'El usuario "',NombreUsuario2 ,'" con host "', EquipoHost2,'" fue eliminado con éxito.';
 
 
	  ELSE
	  SELECT 'La SEGUNDA CUENTA DE USUARIO no existe';
 
    END IF;
 
 
    /* Si en host2 no se ha pasado ningún dato entonces se borra la 2ª cuenta estableciendo el host como '%'. */
 
     IF  var4 = 1 AND NombreUsuario2 !='' AND EquipoHost2='' THEN
     	 SELECT 'La SEGUNDA CUENTA DE USUARIO con host "%", existe y se borrará.';
	  SET @Sentencia=CONCAT('DROP USER "'  ,NombreUsuario2,'"@"','%"');
	  SET @Sentencia5=CONCAT('SHOW GRANTS FOR "'  ,NombreUsuario2,'"@"','%"');
 
 
	  SELECT 'El usuario "',NombreUsuario2 ,'" con host "%"', ' posee los siguientes privilegios:';
	  PREPARE Sentencia5 FROM @Sentencia5;
          EXECUTE Sentencia5;
          DEALLOCATE PREPARE Sentencia5;
 
	  PREPARE Sentencia FROM @Sentencia;
          EXECUTE Sentencia;
          DEALLOCATE PREPARE Sentencia;
          SELECT 'El usuario "',NombreUsuario2 ,'" con host "%"', ' fue eliminado con éxito.';
 
 
	  ELSE
	  SELECT 'La SEGUNDA CUENTA DE USUARIO (con host %) no existe';
 
     END IF;
 
 
END $$
DELIMITER ;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar