Archive for the ‘bases de datos’ Category

2 24
08
2012

Conectando MySQL remoto a través de tunel SSH

Viernes, agosto 24th, 2012

Seguramente te habrás encontrado en multitud de ocasiones ante la siguiente situación:

– tienes alojado en un servidor remoto la base de datos MySQL
– el puerto 3306 de MySQL está cerrado para acceder de forma remota
– quieres usar algún cliente, tipo MySQL Query Browser / MySQL Workbench

Lógicamente, al estar el puerto de escucha de MySQL 3306 de forma remota, no podremos acceder bajo un cliente local desde fuera.

Una posible solución para manejar nuestra base de datos, podría ser instalar un aplicativo web como phpmyadmin; o conectarnos por ssh y trabajar bajo línea de comandos sobre MySQL.

Sin embargo, si por comodidad, o por cabezonería, queremos trabajar de forma local conectados a la base de datos externa, utilizando algún tipo de cliente MySQL como los mencionados como MySQL Workbench / MySQL Query Browser, tenemos otra posibilidad, más elegante incluso, que pasa por crear un tunel SSH para acceder a tu servidor de MySQL de manera remota.

Si te encuentras bajo un entorno linux, puedes usar su propio terminal al que ya te encontrarás habituado.

Si por el contrario trabajas bajo sistemas Windows, siempre puedes utilizar algún cliente ssh como PuTTY.

Para ello conectaremos desde el terminal de la siguiente manera:


ssh -N -L 3307:127.0.0.1:3306 userName@remoteHost

para a continuación introducir lógicamente el password para el usuario correspondiente.

Una vez conectado el tunel ssh, es momento de abrir nuestro cliente de MySQL y conectarnos a la base de datos como si en nuestro equipo se encontrara, indicando la ip localhost 127.0.0.1, pero intercambiando el puerto por defecto de MySQL 3306 por el puerto que hayamos indicado en la conexión, en este caso el puerto número 3307.

Conexión MySQL a través de tunel SSH

Conexión MySQL a través de tunel SSH

13 17
06
2012

The backup set holds a backup of a database other than the existing

Domingo, junio 17th, 2012

No te acostarás sin un problema más… digo… sin saber una cosa más…

Durante el día de hoy, hemos tenido el siguiente problema al restaurar una base de datos en SQL Server 2008 R2 creada desde otro equipo diferente:

Restore failed for Server ‘[SERVERNAME]’.  (Microsoft.SqlServer.SmoExtended)

Additional Information:

System.Data.SqlClient.SqlError: The backup set holds a backup of a database other than the existing ‘[DATABASENAME]’ database. (Microsoft.SqlServer.Smo)

Restore failed for server microsoft.sqlserver.smo

Restore failed for server microsoft.sqlserver.smo

La solución a este problema Restore failed for ServerMicrosoft.SqlServer.SmoExtended… al intentar restaurar una base de datos SQL Server .bak, es mucho más sencilla de lo que puede parecer en un primer momento.

En el momento en el que vayamos a restaurar la base de datos SQL Server, una vez seleccionadas todas las opciones de importación de la misma desde la pestaña General, antes de ejecutar el proceso pulsando el botón OK / Aceptar, accedemos a la pestaña Options u Opciones, y activamos la opción Overwrite the existing database (WITH REPLACE) – o Sobreescribir la base de datos existente -, tal y como se muestra en la siguiente imagen.

SQL Server - The backup set holds a backup of a database other than existing

SQL Server – The backup set holds a backup of a database other than existing

 

 

Una vez seleccionada la opción de sobreescribir la base de datos existente, ya podremos ejecutar el proceso de restauración SQL Server sin problema.

 

7 20
12
2011

El servicio SQL Server se detiene

Martes, diciembre 20th, 2011
SQL Server 2008 Express R2

SQL Server 2008 Express R2

Recientemente, trabajando con el gestor de base de datos de Microsoft SQL Server 2008 R2 Express, tuvimos problemas con el inicio de su servicio.

El servicio estaba establecido con arranque automático, sin embargo, al iniciar windows el servicio de SQL Server aparecía parado; y a pesar de arrancarlo manualmente, a los pocos segundos se volvía a detener.

La extrañeza llegó a nuestros corazones, ya que en ningún momento se había realizado ningún cambio en la base de datos, ni en el sistema, más allá de las típicas actualizaciones de Windows.

Tras probar en varias ocasiones el arranque manual del servicio (esperando quizás que el duendecillo de turno lo arreglara sin decir nada), finalmente buscamos errores que por suerte se registraron en el visor de sucesos de Windows.

El mensaje concreto que aparecía en el visor de eventos era:

No se pudo realizar la actualización de nivel de script para la base de datos ‘master’ porque el paso de actualización ‘sqlagent100_msdb_upgrade.sql’ detectó el error 574, estado 0, severidad 16. Se trata de una condición de error grave que podría interferir con las operaciones normales y dejar la base de datos sin conexión. Si el error se produjo durante la actualización de la base de datos ‘maestra’, impedirá que se inicie toda la instancia de SQL Server. Examine las entradas anteriores del registro de errores, emprenda las acciones correctivas adecuadas y reinicie la base de datos de forma que se puedan completar los pasos de actualización del script.

Tras un buen rato googleando, confirmamos que el problema se generó tras las actualizaciones de Windows, y encontramos la siguiente solución que exponemos a continuación:

1. Habilitamos el indicador de traza 902, para ello:

  • Abrimos el Administrador de configuración de SQL Server (lo encontrarás bajo Herramientas de configuración)
  • En Servicios de SQL Server, abrimos el diálogo de propiedades del servicio SQL Server (SQLEXPRESS)
  • Accedemos a la ficha de Opciones Avanzadas
  • Buscamos la variable «Parámetros de inicio» e incluimos «;-T902» al final del valor.

2. Iniciamos el servicio de SQL Server (en este punto el servicio ya no se detiene)

3. Nos conectamos a través de Microsoft SQL Server Management Studio al servidor

4. En propiedades del servidor, desmarcamos la opción «Implicit transactions»

Propiedades de conexión - Microsoft SQL Server Management Studio

Propiedades de conexión - Microsoft SQL Server Management Studio

5. Volvemos a detener el servicio, y eliminar el indicador de traza 902 habilitado en el punto 1.

6. Volvemos a iniciar tanto el servicio de SQL Server como del Agente SQL Server

7. Volvemos a conectarnos a través de Microsoft SQL Server Management Studio y bajo la rama Administración del explorador de objetos, botón derecho del ratón en Recopilación de datos, y habilitamos la recopilación de datos si existiera la opción.

0 22
10
2011

Habilitar la pluralización de nombres

Sábado, octubre 22nd, 2011

Recientemente me encontraba realizando un proyecto en el que estaba utilizando linq para trabajar con base de datos.

Para ello, generamos nuestro modelo de datos mapeando la base de datos a través de la funcionalidad que proporciona Visual Studio: LINQ to SQL classes.

A grandes rasgos, lo que consigues mapeando tu base de datos a través de un modelo de datos, en este caso a través de LINQ, es generar clases correspondientes a cada una de las tablas existentes.

En próximos posts nos adentraremos más a fondo en cómo funciona LINQ, porque hoy es únicamente momento de explicar cómo habilitar la pluralización de nombres.

Pues bien, como hemos dicho, por cada tabla, se crea una clase, y ahí está el fin de este artículo. El proyecto del que os hablo, lo estaba realizando en diferentes ordenadores sobre Visual Studio 2008, y daba la casualidad, de que al regenerar el modelo de datos (LINQ to classes), en ocasiones aparecían los nombres de las clases en plural y en otras ocasiones los nombres de las clases en singular.

La primera vez no le di mayor importancia, seguro por desconocimiento, y lo achaqué a algún despiste inicial en la generación del diseño de datos.

Pues bien, nada más lejos de la realidad. Estos nombres de clases en plural o singular en nuestro modelo de datos generado para linq, podemos elegir si los deseamos trabajar en plural o singular.

Para ello, simplemente debemos configurar Visual Studio de la siguiente forma:

Herramientas –> Opciones

Dentro del cuadro de diálogo de Opciones, expandimos la sección de Herramientas para base de datos, para seleccionar a continuación la opción O/R Designer.

Una vez llegados a este punto, simplemente debemos elegir True o False para habilitar o no la pluralización de nombres del diseño de bbdd.

Nombres en plural modelo de datos LINQ

Nombres en plural modelo de datos LINQ

Para más información podéis acceder al siguiente enlace de microsoft: activar y desactivar la pluralización

0 03
11
2010

Registros aleatorios en MySQL

Miércoles, noviembre 3rd, 2010
En ocasiones necesitaremos en nuestras aplicaciones obtener un listado de registros aleatorios de la Base de Datos.
Esta opción puede ser útil por ejemplo, a la hora, de tener en nuestro blog una sección de posts o entradas aleatorias.

Para ello, podemos hacer uso de la ordenación aleatoria de MySQL: ORDER BY RAND()

SELECT * FROM wp_posts <strong>ORDER BY RAND()</strong>;

Si además combinamos ORDER BY RAND con LIMIT, podremos limitar el número de resultados aleatorios dentro del conjunto total de registros:

SELECT * FROM wp_posts <strong>ORDER BY RAND()</strong> LIMIT 10;

IMPORTANTE: ¡Ojo!, ten en cuenta que esta opción es factible siempre y cuando la tabla de la que obtendremos los registros no sea muy grande, con la idea de que no afecte de forma negativa al rendimiento de tu base de datos.

4 05
10
2010

Letra Capital Con SQL

Martes, octubre 5th, 2010

Cuando hablamos de letra capital, estamos hablando del estilo de texto en el que la primera letra de cada palabra aparece en mayúscula, y el resto de la palabra, en minúscula.

Es Decir, Algo Como Esta Frase Que Estás Leyendo Ahora Mismo, O Como El Título De Este Post.

Esto puede ser útil por ejemplo para formatear nombres propios de personas, o por ejemplo, nombres de ciudades: Gran Canaria.

En algunos lenguajes de programación,  existen funciones ya predefinidas que te ofrecen esta posibilidad (como por ejemplo ucwords en PHP), pero … ¿y en lenguaje SQL?

En motores de gestión de base de datos como Oracle, contamos con una función predefinida que convierte a mayúsculas el primer caracter de cada palabra de una cadena: InitCap.

Sin embargo, en otros sistemas de gestión de base de datos como MySql o SqlServer, tendremos que «buscarnos la vida«.

A continuación veremos 2 funciones que nos permitirán modificar nuestras cadenas de texto combinando MAYÚSCULAS y minúsculas directamente en nuestras consultas SQL.

La idea es sencilla: recorreremos la cadena de texto letra por letra en búsqueda de espacios en blanco o cualquier otro carácter separador, marcando con ayuda de una bandera o flag, la indicación de que debemos convertir la siguiente letra en mayúscula.

Letra Capital / Mayúscula-Minúscula En MYSQL

DELIMITER $$

DROP FUNCTION IF EXISTS `test`.`UCWORDS` $$
CREATE FUNCTION `test`.`UCWORDS` (input VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
  -- Declaración de variables
  DECLARE i INT DEFAULT 0;
  DECLARE length INT;
  DECLARE flag TINYINT DEFAULT 1;
  DECLARE output VARCHAR(255) DEFAULT '';

  -- Para evitar sorpresas, pasamos toda la cadena de texto a minúsculas
  SET input = LOWER(input);
  -- Guardamos la longitud de la cadena a recorrer para utilizarla a continuación
  SET length = LENGTH(input);

  -- Recorremos toda la cadena de texto
  WHILE (i <= length) DO
    IF (flag=1) THEN
      -- El flag estaba activado, lo que significa que habíamos encontrado un espacio en blanco y debemos pasar a mayúscula el carácter actual.
      SET output = CONCAT(output, UPPER(MID(input, i, 1)));
      SET flag = 0;
    ELSE
      SET output = CONCAT(output, MID(input, i, 1));
    END IF;
    IF (MID(input, i, 1) IN (' ', ',', ';', '.', ':', '!', '?', '_', '-', '/', '&', '''', '(', ')')) THEN
      -- Hemos encontrado un espacio en blanco, por lo que activamos nuestra bandera para la próxima iteración.
      SET flag = 1;
    END IF;
    SET i = i+1;
  END WHILE;

  RETURN output;

END $$

DELIMITER ;

Letra Capital / Mayúscula-Minúscula En SQLSERVER


-- =============================================
-- Author:		v3rgu1.com
-- Description:	Función que permite capitalizar
--              un String
-- =============================================
ALTER FUNCTION [dbo].[InitCap]
(
	-- Parámetros
	@INPUT AS VARCHAR(4000)
)
RETURNS VARCHAR(4000)
AS
BEGIN
	-- Declaración de variables
	DECLARE @I AS INT
	DECLARE @LENGTH AS INT
	DECLARE @FLAG AS BIT
	DECLARE @OUTPUT AS VARCHAR(4000)

	-- Inicializamos el contador a 0
	SET @I = 0;
	-- Para evitar sorpresas, pasamos toda la cadena de texto a minúsculas
	SET @INPUT = LOWER(@INPUT);
	-- Guardamos la longitud de la cadena a recorrer para utilizarla a continuación
	SET @LENGTH = LEN(@INPUT);
	-- Inicializamos la bandera como activa para capitalizar la primera letra de la cadena
	SET @FLAG = 1;
	SET @OUTPUT = '';

	-- Recorremos toda la cadena de texto
	WHILE (@I <= @LENGTH) BEGIN
		IF (@FLAG = 1) BEGIN
			-- El flag estaba activado, lo que significa que habíamos encontrado un espacio en blanco y debemos pasar a mayúscula el carácter actual.
			SET @OUTPUT = @OUTPUT + UPPER(SUBSTRING(@INPUT, @I, 1));
			SET @FLAG = 0;
		END ELSE BEGIN
			SET @OUTPUT = @OUTPUT + SUBSTRING(@INPUT, @I, 1);
		END
		IF (SUBSTRING(@INPUT, @I, 1) IN (' ', ',', ';', '.', ':', '!', '?', '_', '-', '/', '&', '''', '(', ')')) BEGIN
			-- Hemos encontrado un espacio en blanco o algún caracter separados,
			-- por lo que activamos nuestra bandera para la próxima iteración.
			SET @FLAG = 1;
		END
		SET @I = @I + 1;
	END -- WHILE

	RETURN @OUTPUT
END