Social Icons

twitter facebook google plus linkedin

sábado, 29 de diciembre de 2012

InfoMaritima - Proyecto de Aplicacion para Windows 8

¡Que taaal!

Debo reconocerlo: No tengo skills de desarrollador (y menos de diseñador), pero hago el intento y espero mejorar. Es por esto que liberé una primera versión de una aplicacion para Windows 8, que ya está en el market.

Es una aplicación que entrega los avisos vigentes de marejadas y de mal tiempo para las costas de Chile. Muy útil para antes de ir a la playa, para ver si están las condiciones para hacer deportes náuticos.

Es bueno estar al tanto de lo que ocurre.

La url a la aplicación es esta: http://apps.microsoft.com/windows/es-CL/app/infomaritima/c3ee93a1-0953-4375-b1dc-439763a716a1 y puedes encontrar mas informacion  y capturas de pantalla.

¡Envienme sus comentarios!

 

jueves, 20 de diciembre de 2012

Error converting data type nvarchar to float -- FFFFUUUUUUUUU

¡Que taaaaaal! No estaba muerto, ni andaba de parranda. Estaba cambiándome de hosting todos los sitios que tenía. Me fui de GoDaddy a Bluehost. Hasta el momento va todo bien y espero que no falle en la mitad del camino como lo hizo mi antiguo proveedor. Además que salía más barato. En fin. Hay que apretarse el pantalón muchas veces para poder sobrevivir y mas aun en la interné.

Estaba trabajando haciendo una conversion de tipos de datos y recibí un error así al hacer un cast:
Error converting data type nvarchar to float

¡Ups! Estaba completamente seguro que no habían letras en los registros. El problema estaba es que hacía la separacion decimal con "," y no con "." .

Asi que ocupé la funcion replace para corregir el panorama:

UPDATE tabla SET campo = replace(campo,',','.')


y asi fue como funcionó. Obviamente hay que hacer unos cast o convert entre medio para que la cosa ande.

¡Chau!

viernes, 7 de diciembre de 2012

Exportar objetos de la base de datos a archivos de texto en SQL Server

Hola a todos. He estado medio flojo con el blog, pero ahora retomo la actividad. Mucho trabajo, mucho que estudiar y aprender y ahora he vuelto.

Les dejo este video tutorial recién salido del horno donde muestra como volcar los objetos de una base de datos hacia un archivo de texto plano.



¡Chau!

sábado, 24 de noviembre de 2012

Error Foreach en C# al recorrer un DataSet

Estaba programando en C# para agilizar la mente y al querer recorrer un dataset con un foreach, me encuentro con el siguiente error:
foreach statement cannot operate on variables of type 'System.Data.DataSet' because 'System.Data.DataSet' does not contain a public definition for 'GetEnumerator'

Es un error bastante simple de solucionar.  Solo basta agregar Tables[0].Rows al objeto que se va a recorrer. Por ejemplo

foreach con error:
foreach(DataRow linea in MiDataSet)
{
bla bla
}


foreach corregido:
foreach(DataRow linea in MiDataSet.Tables[0].Rows)
{
bla bla
}


Simple.

¡Chau!

viernes, 23 de noviembre de 2012

¿Que pasa cuando SQL Browser no está arriba?

Puede que para muchos sea un misterio lo que realiza este servicio, ya que es un servicio silencioso.  Pero, ¿A qué se dedica este puerto? Fácil. Se dedica a estar a la escucha de las conexiones entrantes que hacen uso de los recursos de SQL Server. Por ejemplo, si se tiene una instancia nombrada permite que nos podamos conectar a esa instancia nombrada.

¿Qué pasa si el servicio no está arriba? Al momento de entrar por SSMS, nos arrojará un error así:

[caption id="attachment_1508" align="alignnone" width="300"]Error al no estar iniciado SQL Browser Error al no estar iniciado SQL Browser[/caption]

Solo queda iniciarlo y funcionará.

No pretendo explicar todo el funcionamiento de SQL Browser, porque en la documentación ya está todo dicho con mucho detalle. Pueden revisarla desde aquí.

 

¡Chau!

jueves, 22 de noviembre de 2012

SQL Server y Teradata... ¿Cómo conectarlos?

Es prácticamente imposible que en las empresas tengan toda su plataforma de una sola marca. Es por esto que las distintas plataformas y aplicaciones deben ser capaces de trabajar junto a otras de otras marcas y con excelente rendimiento.

Hoy me tocó visitar a un cliente donde tenían un Teradata datawarehouse y toda la capa de análisis la querían levantar con SQL Server Analysis Services.

El principal problema estaba en que de forma nativa ambas plataformas no son capaces de conversar entre si y justamente se precisaba que conversaran.

Por fortuna nuestra existe un componente de Teradata para .NET, que hace posible la conexión de aplicaciones hechas en .NET con Teradata. Se puede descargar gratuitamente desde aquí.

Si quieres rapidez, existen unos conectores fabricados por Attunity y proveen una conexión de alta velocidad, casi a wire-speed. Lamentablemente solo existe para SSIS y no directamente para SSAS. Pero desde SSIS se puede ocupar un componente que se llama Partition Processing y que sirve para cargar una partición de un cubo de SSAS. El conector se puede descargar desde aquí

El conector fabricado por Attunity está disponible para Oracle y para ambas arquitecturas (32 y 64 bits).

 

¡Chau!

viernes, 16 de noviembre de 2012

Maximizando la disponibilidad de las aplicaciones de mision critica

Hola Mundo.

El día 14 de Noviembre del presente año, se realizó un evento en el Hotel W (Santiago) para mostrar los nuevos productos de Microsoft justo en un momento de muchos lanzamientos. Recordar que este año se lanzó Windows Server 2012, SQL Server 2012, System Center 2012, Windows 8, una nueva versión de Office 365, entre otras cosas.

Fue un evento al cual asistieron mas de 900 personas. Estuvo muy rico en cuando a contenido. Me invitaron como expositor y toqué el tema de Alta Disponibilidad con SQL Server 2012 aprovechando la tecnología de Always On.

Les dejo las slides del evento.


jueves, 15 de noviembre de 2012

De Trial a Full en SQL Server

Es de lo más normal del mundo desconocer una tecnología y querer conocerla, testearla y usarla para evaluar su adquisición. Me atrevería a decir que todos los productos tienen una edición de evaluación.

La edición de trial de SQL Server no es más que una edición Enterprise que la puedes usar por un determinado período de tiempo (180 días desde su instalación).

Para pasar de una edicion trial a cualquier otra  edición se puede seguir estos pasos:

Abrir el medio de instalación de SQL Server y seleccionar Maintenance y luego seleccionar Edition Upgrade

[caption id="attachment_1494" align="alignnone" width="300"]Upgrade de edicion. Upgrade de edicion.[/caption]

En el paso 2 se introduce la licencia del producto.

Automáticamente reconoce la edición por la licencia que introduzca. Hay que tener en cuenta si se introduce una licencia Standard, todas las características de Enterprise quedarán desactivadas y si la aplicación que es soportada por SQL Server utiliza características de Enterprise, puede que no funcione bien.

[caption id="attachment_1495" align="alignnone" width="300"]Product Key Product Key[/caption]

El paso 3 no tiene complicación alguna. Solo se aceptan los términos y condiciones. En el paso 4 se selecciona la instancia que se quiere actualizar.

[caption id="attachment_1496" align="alignnone" width="300"]Seleccion de la instancia Seleccion de la instancia[/caption]

El paso 5 es la validación del proceso. Solo basta que una regla se rompa para que no funcione.  Un claro ejemplo de sobre NO debe quedar es este:

[caption id="attachment_1497" align="alignnone" width="300"]Validacion Validacion[/caption]

Luego queda hacer que el asistente ejecute las tareas y cruzar los dedos para que todo salga bien. Es importante reiniciar el servicio de SQL Server para que los cambios se apliquen.



Espero que les haya servido.

 

¡Chau!

 

domingo, 11 de noviembre de 2012

SQL Server 2012 SP1 está aquí

Dentro de la semana anterior fue lanzando SQL Server 2012 Service Pack 1 que incluye los dos cumlative updates hasta la fecha y características nuevas de la plataforma de datos.  Las que más destacan para mi son:

Migracion entre clusters  de AlwaysON para la actualización del sistema operativo
Provee todas las herramientas y las capacidades para poder migrar implementaciones de clúster de AlwaysON en el caso que el sistema operativo que alberga el cluster requiera de reiniciar para actualizar el sistema operativo

Indice XML Selectivo
Un nuevo tipo de indices que mejora el rendimiento de las consultas de datos de tipo de datos xml. Reduce espacio en disco y reduce el tiempo de espera de la ejecucion de las consultas.

SQL Server Management Studio Express con todas las funcionalidades de las versiones avanzadas
Por fin.

Pueden encontrar todas las características de este release: Aqui y pueden descargar el service pack: desde aqui

miércoles, 7 de noviembre de 2012

Error de SQL Server Configuration Manager: Cannot connect to WMI provider – Invalid class [0x80041010]

Hoy quise abrir mi SQL Server Configuration  Manager y me salió el siguiente error:

[caption id="attachment_1483" align="alignnone" width="300"]Error de SQL Server Configuration Manager Error de SQL Server Configuration Manager[/caption]

Nunca había visto este error y tampoco mucha idea tenía de como solucionarlo. Así que me puse a investigar en internet y vi que le había pasado a usuarios que tienen SQL 2005, SQL 2008 y SQL 2008 R2 y a mi me pasó con SQL 2012.

Este link fue bastante referencial: http://support.microsoft.com/kb/956013
Aunque la solución estaba para SQL 2008, la acomodé para SQL 2012 y esta es:

Abrir una ventana del cmd con permisos de administrador y escribir lo siguiente:
mofcomp.exe "C:Program Files (x86)Microsoft SQL Server110Sharedsqlmgmproviderxpsp2up.mof"

Un pantallazo:

[caption id="attachment_1484" align="alignnone" width="300"]Solucion Solucion[/caption]

Luego de esto, volver a abrir SQL Server Configuration Manager y correrá sin problemas.

 

Chau!

 

Navega Anónimo con Tor Browser

Hace un par de años, escribí como usar Tor en Windows . En el post hablaba sobre como configurar tor para poder usarlo en Windows y navegar de forma anónima.

Quizá instalar los componentes por separado sea incómodo y engorroso. Peor aun, configurar el proxy y después dejarlo como estaba cuando lo único que queríamos era navegar de forma anónima o pasar por la red de tor.

Menos mal que hace algún tiempo existe un paquete que contiene  todo listo para llegar y usar.  Contiene un navegador ya configurado y todo corriendo para tenerlo en el equipo o llevarlo en un flash drive a cualquier parte.

Está disponible para Windows, MacOSX y Linux. En este link: https://www.torproject.org/projects/torbrowser.html están todas las opciones de descargas (donde podemos escoger el idioma) y están las instrucciones para cada sistema.

¡Ya no hay excusa para no probar Tor!

Error 1478 en SQL Server Mirroring

Este error es bastante recurrente cuando se quiere levantar Database Mirroring. Puede que al momento de configurarlo no se haya presentando ningún warning y ningún error en el proceso, pero si al momento de echar a andar el mecanismo de mirroring aparece este error, es porque no se realizó un paso previo.

[caption id="attachment_1477" align="alignnone" width="300"]Error 1478 Error 1478[/caption]

Así se ve el error y la solución es re simple. Solo hay que respaldar el log de transacciones de la base de datos primaria y restaurar este respaldo en la base de datos de espejo con la opción de NORECOVERY.
Una vez que esta tarea se ha realizado, ya se puede levantar Mirroring y debiéramos tener problemas.

lunes, 5 de noviembre de 2012

Configurar Mirroring en SQL Server

Database Mirroring aparece en la versión 2005 y  es la evolución de Log Shipping. Tal como su nombre lo indica,  sirve para tener una base de datos "espejada" en otro servidor.  Puede trabajar de 3 Formas:

[caption id="attachment_1459" align="alignnone" width="300"]modos de funcionamiento | Fuente: guillesql.es modos de funcionamiento | Fuente: guillesql.es[/caption]

De foma más simple, la principal diferencia entre la configuración síncrona o asíncrona es:

  • De modo síncrono, el servidor principal espera a que las transacciones hagan commit en el servidor espejo para poder continuar.

  • De modo asíncrono, el servidor principal trabaja sin esperar al secundario.


Algunas diferencias entre LogShipping y Mirroring (Hay muchas más, pero aquí están las que más me llaman la atención):

  • Database Mirroring es capaz de configurar una conexión segura entre ambos puntos.

  • Database Mirroring provee la capacidad de hacer failover automático.


Log Shipping no hace ninguna de las dos anteriores.

Para configurar Database Mirroring se puede hacer a través del asistente o se puede hacer a través de instrucciones en t-sql. En este caso, utilizaremos el asistente para ahorrar tiempo.

Antes de partir la configuración nos debemos asegurar que la base de datos esté en modo de recuperación Full y debemos crear un respaldo de la base de datos del servidor primario y restaurarla con la opción WITH NORECOVERY en el servidor que será espejo.

Esta configuración requiere algunas configuraciones en el firewall de ambos equipos. En el servidor principal y en el espejo se debe abrir el puerto TCP 5022. Ahora, si se decide usar otro puerto, hay que estar seguro que el puerto está disponible y se puede abrir para las conexiones.

Una vez que se tiene la configuración previa lista, se hace el asistente que permitirá configurar el mirroring

[caption id="attachment_1462" align="alignnone" width="256"]Abrir asistente Abrir asistente[/caption]

En la ventana principal se debe iniciar el asistente

[caption id="attachment_1463" align="alignnone" width="300"]Ventana Principal Ventana Principal[/caption]

Se inicia el asistente

[caption id="attachment_1464" align="alignnone" width="300"]Inicio del asistente Inicio del asistente[/caption]

Se puede o no configurar un testigo. El testigo servirá para poder tener un failover automático. En este artículo no configuraré un testigo.

[caption id="attachment_1465" align="alignnone" width="300"]Configuracion del testigo Configuracion del testigo[/caption]

Configuración del equipo principal. Se puede cambiar el puerto (pero recuerden que ya habíamos abierto el puerto 5022). Además, se puede seleccionar si se quiere cifrar o no la conexión.

[caption id="attachment_1466" align="alignnone" width="300"]Configuracion del primario Configuracion del primario[/caption]

Para la configuración del secundario es necesario conectarse antes (recordar abrir el puerto 1422 en el secundario). La ventana de configuración es exactamente igual al primario.

[caption id="attachment_1467" align="alignnone" width="300"]Configuracion del Secundario Configuracion del Secundario[/caption]

El servicio debe estar configurado con una cuenta de dominio. Se debe indicar la cuenta del servicio del servidor primario y del espejo.

[caption id="attachment_1468" align="alignnone" width="300"]Cuentas de servicio Cuentas de servicio[/caption]

Para Finalizar:

[caption id="attachment_1469" align="alignnone" width="300"]Finalizar Finalizar[/caption]

Al momento de finalizar, se inicia el proceso de configuración del mirroring. Si aparece este mensaje, es porque está todo bien

[caption id="attachment_1470" align="alignnone" width="300"]Progreso de Configuracion Progreso de Configuracion[/caption]

Al terminar el asistente, aparecerá una ventana así en la cual nos preguntará si queremos iniciar Mirroring al tiro o no. En mi caso, no  configuré el testigo, por lo que no activaré el mirroring para hacer una configuración antes de partir.

[caption id="attachment_1472" align="alignnone" width="300"]Iniciar mirroring Iniciar mirroring[/caption]

Antes de comenzar el mirroring, lo configuré como asíncrono y luego inicié el mirroring

[caption id="attachment_1474" align="alignnone" width="300"]Mirroring Funcionando Mirroring Funcionando[/caption]

 

Si por algún motivo, te aparece el error 1478 cuando echas a andar el mirroring, es porque debes respaldar el transaction log del servidor primario y luego tienes que hacer un restore with norecovery en el servidor espejo. Luego de eso, ya puedes echar a andar el mirroring.

Chau!

viernes, 2 de noviembre de 2012

Configurando Log Shipping

Log Shipping es una de las formas más rudimentarias de "alta disponibilidad" y recuperación de desastres. Creo que apareció por primera vez en la versión 2000 y que versión tras versión se ha ido mejorando.
Esta configuración consta de tres etapas:

  1. Respaldo del log de transacciones de la instancia primaria

  2. Copia del log de transacciones desde la instancia primaria hacia la segunda instancia

  3. Restauración de las transacciones en la instancia secundaria


Para configurar Log Shipping se necesita

  1. Una instancia primaria con una base de datos con Full Recovery Mode o Bulk-Logged Recovery Mode.

  2. Una instancia secundaria. Esta puede estar en la misma máquina o en otra máquina.

  3. Ambos servicios de SQL Agent deben estar funcionando y con una cuenta de dominio.

  4. Una carpeta donde la cuenta de dominio de SQL Agent pueda leer y escribir.

  5. Solo si ambas instancias están en servidores separados, el servidor primario debe tener la carpeta compartida donde dejará los logs y el servidor secundario debe tener una carpeta donde la cuenta de SQL Agent pueda escribir y leer.

  6. Una tercera instancia para que sea de testigo (Opcional)


Pasos:

1.- Servicios en marcha
Antes de partir, es necesario revisar que el servicio de SQL Agent se encuentra funcionando en ambos servidores (En este caso utilizaré dos máquinas para configurar Log Shipping). Este servicio debe estar configurado con una cuenta de dominio.

2.- Carpetas
En la máquina primaria, crearemos una carpeta compartida donde la cuenta de SQL Agent tenga permisos de lectura y escritura. La pyeden crear donde quieran. Yo la crearé en C:. También crearé una carpeta en el servidor primario donde la cuenta de SQL Agent tenga permisos de lectura y escritura.

3.- Configuración de la administración remota de SQL Server en la máquina secundaria
En una etapa de la configuración se requiere conectarse a la instancia de la instancia secundaria para poder configurar la base de datos en el destino. Nada más hay que permitir las conexiones por el puerto 1433 TCP en el firewall de la máquina secundaria.

4.- Configuración de log shipping en la base de datos primaria
Se escoge la base de datos y en el menú se escoge: "Ship Transaction Logs"

[caption id="attachment_1447" align="alignnone" width="300"]Ship Transaction Logs Ship Transaction Logs[/caption]

Se abrirá una ventana y se debe seleccionar el primer checkbox que aparece. Ese que dice: "Enable this as a primary in a log shipping configuration" y se hace click en el botón Backup Settings.

[caption id="attachment_1449" align="alignnone" width="300"]Configuracion de LogShipping Configuracion de LogShipping[/caption]

En Backup settings se configuran las rutas donde irán a parar los log de transacciones en la instancia primaria. Se debe configurar la ruta del recurso compartido y de la carpeta local. Además, se puede configurar la frecuencia de los respaldos, pero para efectos de este artículo no nos meteremos ahí.

[caption id="attachment_1448" align="alignnone" width="295"]BackUp Settings BackUp Settings[/caption]

Al momento de hacer click en Ok la ventana se cierra y vuelve a la ventana inicial. Aquí se configura los secundarios.
En la ventana, hacer click en Addy se abrirá otra ventana.

[caption id="attachment_1450" align="alignnone" width="300"]Configuracion Secundario Configuracion Secundario[/caption]

Se tienen varias opciones: Respaldar la base de datos automáticamente, copiarla a la otra instancia y restaurarla, restaurar un respaldo ya creado en la segunda instancia, o bien, dejar que todo está OK, siempre y cuando nosotros antes hayamos restaurado la base de datos desde un respaldo.
Para efectos de este artículo, dejaremos que el asistente realice toda la tarea.

[caption id="attachment_1451" align="alignnone" width="300"]Configuracion de Copia de Archvos Configuracion de Copia de Archvos[/caption]

Se configura el directorio donde se copiarán los respaldos desde el primario hacia el secundario. Yo configuré la ruta del directorio compartido del servidor secundario.
Una vez que está todo listo, le damos OK a la ventana actual y a la principal.
Aquí comenzará a configurar el servidor primario y el secundario. Una vez que esté listo, mostrará algo así:

[caption id="attachment_1452" align="alignnone" width="300"]Progreso de la configuracion Progreso de la configuracion[/caption]

En el servidor secundario ya podemos ver una base de datos que está en constante proceso de restauración.

5.- Prueba
Para ver que todo funcione, bajamos los servicios de SQL Server de la instancia primaria y en el servidor secundario ejecutamos la consulta:
RESTORE MiDB WITH RECOVERY
Y podemos hacer una consulta a los datos que tenemos.

Interesantes puntos

  • El failover no es automático

  • Los Jobs que se encargan de respaldar y restaurar tardan, por defecto, 15 minutos


Nos vemos en la próxima entrega

miércoles, 10 de octubre de 2012

Usando la funcion dateadd() - Funcion de manejo de fecha y hora en SQL Server

Los motores de bases de datos tienen capacidades para manejar fechas de forma muy precisa. Es por esto que incluyen funciones para trabajar con éstas. Existen muchas funciones, pero en este caso hablaremos sobre dateadd().

La función dateadd() devuelve un valor de fecha, manipulado en uno de los elementos de la fecha. La función tiene 3 parámetros: datepart, el cambio y el elemento donde se va a manipular la fecha.
Los datepart son los componentes de una fecha. Estos son:

  • year

  • quarter

  • month

  • dayofyear

  • day

  • week

  • weekday

  • hour

  • minute

  • second

  • millisecond

  • ms

  • microsecond

  • mcsnanosecond



El numero, debe ser un valor entero. Si es un valor decimal, el decimal se truncará y solo quedará la Porción entera.

Ejemplo:
Agregar un año a la fecha actual:
SELECT DATEADD(year,1,GETDATE())

Juego con los milisegundos, nanosegundos y microsegundos (sacado desde MSDN):

DECLARE @datetime2 datetime2 = '2007-01-01 13:10:10.1111111'
SELECT '1 millisecond' ,DATEADD(millisecond,1,@datetime2)
UNION ALL
SELECT '2 milliseconds', DATEADD(millisecond,2,@datetime2)
UNION ALL
SELECT '1 microsecond', DATEADD(microsecond,1,@datetime2)
UNION ALL
SELECT '2 microseconds', DATEADD(microsecond,2,@datetime2)
UNION ALL
SELECT '49 nanoseconds', DATEADD(nanosecond,49,@datetime2)
UNION ALL
SELECT '50 nanoseconds', DATEADD(nanosecond,50,@datetime2)
UNION ALL
SELECT '150 nanoseconds', DATEADD(nanosecond,150,@datetime2);


Esto se puede usar, por ejemplo, para saber cuántas órdenes de trabajo fueron realizadas por un usuario la semana pasada.
Tiene muchos usos.
Para más información pueden visitar la referencia oficial: http://msdn.microsoft.com/es-es/library/ms186819.aspx
¡Chau!

domingo, 7 de octubre de 2012

Uso de PRIMARY KEY y UNIQUE

¿Cual se debe usar? Se debe usar la que más se acomode al escenario.
Algunos facts:

  • Una PRIMARY KEY debe ser UNIQUE, pero un UNIQUE no tiene por qué ser una PRIMARY KEY

  • Una PRIMARY KEY no acepta valores NULL. Un campo UNIQUE puede o no aceptar valores NULL

  • Solo puede existir una PRIMARY KEY en una tabla, pero pueden haber más de un campo UNIQUE

  • Tanto una PRIMARY KEY como un campo UNIQUE pueden ser referenciados por una FOREIGN KEY


Lo copio textual desde la documentacion:
La creación de un índice único garantiza el fracaso de cualquier intento de duplicar valores de clave. No existen diferencias significativas entre crear una restricción UNIQUE y crear un índice único que es independiente de una restricción. La validación de datos se produce de igual modo y el optimizador de consultas no distingue entre un índice único creado mediante una restricción o creado manualmente. Sin embargo, debe crearse una restricción UNIQUE en la columna cuando el objetivo es la integridad de los datos. Esto deja claro el objetivo del índice.


Creo que mejor explicación no tiene :)

sábado, 6 de octubre de 2012

Diferencia entre GRANT y WITH GRANT OPTION

Para conceder permisos sobre objetos a usuarios o roles en una base de datos, es necesario usar la instruccion GRANT.
Por ejemplo, para concederle permiso de SELECT al usuario pepito sobre la tabla cliente lo hacemos así:
GRANT SELECT ON cliente TO pepito
Pero si queremos que pepito le pueda otorgar el mismo privilegio de SELECT a otros usuarios, usamos WITH GRANT OPTION
:
GRANT SELECT ON cliente TO pepito WITH GRANT OPTION

Para resumir: GRANT se utiliza para otorgrar privilegios sobre objetos a usuarios y roles. WITH GRANT OPTION se utiliza para que el mismo usuario pueda otorgrar el mismo privilegio sobre el mismo objeto a otros usuarios o roles.

¡Chau!

lunes, 1 de octubre de 2012

Manipular un identity de una columna con dbcc checkident

En este artículo chiquitito les contaré como manipular el valor de un campo con identity.

Hay una instrucción en T-SQL que se llama dbcc checkident  que sirve para manipular campos con identity, entre otras cosas, puede servir para resetear el contador (de una forma parecida que truncate, pero sin borrar datos).

Para este ejemplo, crearemos una tabla:


CREATE TABLE MiTable
(
id INT IDENTITY(1,1) NOT NULL,
fecha DATETIME NOT NULL
)


E insertaremos 3 valores

INSERT INTO MiTabla (fecha) VALUES (GETDATE())
INSERT INTO MiTabla (fecha) VALUES (GETDATE())
INSERT INTO MiTabla (fecha) VALUES (GETDATE())


Chequearemos con dbcc checkident el ultimo valor generado:
dbcc checkident('MiTabla',NORESEED)
Y debiera entregar algo más o menos así:



Checking identity information: current identity value '3', current column value '3'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.


Bien, sabemos el último elemento insertado es el 3 y el próximo será el 4. ¿Cómo lo hacemos para que el próximo elemento sea el 20? Fácil:
dbcc checkident('MiTabla',RESEED,19)
Debiera decir algo así:



Checking identity information: current identity value '3'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.



Ahora insertemos un valor más:
INSERT INTO MiTabla (fecha) VALUES (GETDATE())
Y consultamos por el ultimo valor:
SELECT TOP 1 * FROM MiTabla ORDER BY id DESC
Vemos que el id es 20.

Tomen nota que se toma el numero anterior al valor que queremos que se genere cuando se indica con dbcc checkident.

También funciona con valores negativos:
dbcc checkident('MiTabla',RESEED,-19)
Ahora insertemos un valor más:
INSERT INTO MiTabla (fecha) VALUES (GETDATE())
Y consultamos por el ultimo valor:
SELECT TOP 1 * FROM MiTabla ORDER BY id ASC
Vemos que el id es -18.

¡Chau!

viernes, 28 de septiembre de 2012

Contained Databases en SQL Server 2012

Es muy común que una base de datos, en algún momento de su existencia y por razones particulares, tenga que ser llevada hacia otro servidor SQL Server. El proceso es simple. Hay que exportar la base de datos hacia el servidor de destino y listo. No tiene mucha complicación ni ciencia alguna. Todos sabemos que este escenario ideal no existe. Nunca una migración va a ocurrir de esta forma. Siempre algo que requerirá más trabajo, que son los objetos a nivel de aplicación.

Una Contained Database guarda absolutamente todos sus objetos dentro de la base de datos, cosa que cuando sea necesario levantar la base de datos, lo pueda hacer sin problema alguno. O sea, no tiene dependencias.

Una contained database almacena lo siguiente:

  • Tables

  • Functions

  • Constraints

  • Schemas

  • Types

  • Logins

  • Application-Level Agent Job

  • Persisted error messages

  • Linked server information

  • System Settings


Y soporta ambas autenticaciones.

Para habilitar el login hacia contained databases, se debe ejecutar el siguiente código:


sp_configure 'show advanced', 1;
RECONFIGURE WITH OVERRIDE;
go
sp_configure 'contained database authentication', 1;
RECONFIGURE WITH OVERRIDE;
go


Para crear una base de datos contenida, se puede hacer via código:


CREATE DATABASE [MiDB] CONTAINMENT = PARTIAL


O se puede hacer a través del asistente:

[caption id="attachment_1415" align="alignnone" width="300"]Creacion de un usuario a través de wizard Creacion de un usuario a través de wizard[/caption]

Para crear un usuario se hace usan las mismas instrucciones como si fuera una base de datos común y corriente:


USE MiDB
GO
CREATE USER MiUSER WITH PASSWORD = 'TEST123!!'
GO


En conclusión, una contained db es una base de datos común y corriente, pero se diferencia de las demás porque almacena todos los objetos necesarios para funcionar en cualquier instancia de SQL Server 2012.

viernes, 21 de septiembre de 2012

Diferencia entre SELECT @@IDENTITY, SELECT SCOPE_IDENTITY() y SELECT IDENT_CURRENT('tabla')

Hola Mundo

No es una novedad que en los motores de bases de datos exista una función que sirva para generar números de forma correlativa, o bien, definiendo un inicio y un incremento. Por ejemplo, en MySQL existe auto_increment y en SQL Server se llama identity.

Aprovecho estas líneas para tirar las orejas de aquellos desarrolladores que usan estas funciones de auto incremento como claves primarias. Hay muchas funciones que generan valores únicos y que son justamente para eso.

Volviendo al tema. En SQL Server existen 3 funciones que permiten saber el último número generado con identity. Estas funciones se ámbito en el ámbito en el cual operan.

SELECT @@IDENTITY

Esto devolverá el último valor generado con identity. No importa donde haya sido, simplemente lo mostrará.

SELECT SCOPE_IDENTITY()

Devolverá el último valor generado en el ámbito. Por ejemplo, si se está trabajando dentro de un trigger, devolverá el último valor que identity generó dentro del trigger.

SELECT IDENT_CURRENT('tabla')

Devolverá el último valor generado en la tabla que se especifica.

 

Ojalá que les sirva.

 

Chau

jueves, 6 de septiembre de 2012

Duplicar datos tabla en la misma tabla (Y como comerse la memoria y el disco de forma brutal)

Hoy estaba jugando con mi SQL Server, obviamente en entorno de pruebas,  y tuve la "brillante" idea de duplicar los datos de una tablas de hecho de AdventureWorksDW. Aparte de lograr que los registros se duplicaran, noté bastantes cosas que quiero compartir con ustedes.

Importante: Antes de duplicar los datos dentro de la misma tabla, debes desactivar las claves primarias. De lo contrario, arrojará un error. Recomiendo copiar los datos hacia una tabla temporal.

Sentencias:

INSERT INTO tabla SELECT * FROM tabla
Esta es la sentencia básica. Lo que hace es seleccionar todos los registros y volverlos a insertar. O sea, si se tienen 10 registros, insertará esos mismos 10 registros, quedando así con 20 registros. Ésta es la forma mas básica que hay.

INSERT INTO tabla SELECT top 100 * FROM tabla
Esta selecciona los 100 primeros registros y las inserta. O sea, si se tienen 1000 registros, insertará los primeros 100 registros, quedando así con 1100 registros.

INSERT INTO tabla SELECT * FROM tabla WHERE campo1 = 'algo'
Esta sentencia selecciona e inserta solo los registros donde la clausula WHERE se cumpla. No importa cuantos registros sean.

INSERT INTO tabla SELECT top 100 * FROM tabla WHERE campo1 = 'algo'
Esta hace lo mismo que la anterior, pero solo tomando en cuenta los 100 primeros registros.

Nunca hagas esto (a no ser de que sepas muy bien lo que estás haciendo)

Puedes hacer un sencillito script que duplique de forma exponencial los registros, causando un excesivo uso de disco y recursos de memoria. Con esta operación, el log de transacciones crece de forma desmesurada.


DECLARE @contador int
SET @contador = 0
WHILE (@contador < 10)
BEGIN
INSERT INTO tabla SELECT * FROM tabla
SET @contador = @contador + 1
END
GO

Si tenemos una tabla de 1000 registros, la primera vez insertará 1000 registros, quedando así con 2000 registros. La segunda vez, seleccionará los 2000 registros y los insertará, quedando así con 4000 registros. Esto ocurrirá hasta que se cumpla la condición (Imagina este escenario, pero  partiendo con 60000 registros)

Para finalizar quiero exponer algunas conclusiones:

  1. Nunca realices experimentos así en entornos de producción.

  2. Siempre ten un respaldo de las bases de datos.

  3. Ten controlado el crecimiento del log de transacciones. Hay mucha documentación al respecto.

  4. Si vas a duplicar los datos de tu tabla, hazlo de manera controlada y no de forma brutal (como lo hice yo)


Chau!

jueves, 16 de agosto de 2012

Agrandar disco virtual con Virtualbox

Hola Mundo. Una de las cosas que me enferma de Virtualbox, es que en la ventana principal de la aplicación no aparecen todas las opciones para trabajar con los distintos medios virtuales. Por ejemplo, no existe ninguna opcion para hacer un resize del disco duro virtual.

No todo es tan malo, ya que existe una herramienta llamada VBoxManage que funciona bajo la linea de comandos y que se encarga de las tareas un poco más complejas.

Hay que iniciar el cmd con permisos de administrador y navegar hacia la carpeta de Virtualbox (En mi caso es C:Program FilesOracleVirtualbox) e invocamos a la herramienta. La sintaxis es:

vboxmanage modifyhd "rutaalvdi" --resize tamaño_en_MB
Por ejemplo:
Si quiero dejar en 50 GB el VDI de mi VM tengo que hacerlo asi
vboxmanage modifyhd "disco.vdi" --resize 50000
Y mostrará el porcentaje de completación.

Sencillo, ¿no?

martes, 7 de agosto de 2012

Usando la funcion NEWID()

¡Quee taaaaal! Esta función genera un valor único, de tipo uniqueidentifier cada vez que se ejecuta.  Esta función es muy útil al tener que crear valores únicos. Por ejemplo: Una clave primaria.

Veamos algunos ejemplos:

Seleccionar un valor único aleatorio

[caption id="attachment_1396" align="alignnone" width="300"]Valor Unico Valor Unico[/caption]

Seleccionar varios valores al mismo tiempo para comprobar su característica de ser único

[caption id="attachment_1397" align="alignnone" width="270"]Valores Unicos Valores Unicos[/caption]

Ahora usemos esto en un caso real. Creemos una tabla, cuya clave primaria sea un campo de tipo uniqueidentifier


CREATE TABLE MiTabla
(
id UNIQUEIDENTIFIER PRIMARY KEY NOT NULL,
color VARCHAR(10) NOT NULL
)

Ojo con el tipo de datos que tiene el campo id.
Insertamos unos datos

INSERT INTO MiTabla (ID, color) VALUES (NEWID(),'VERDE')
INSERT INTO MiTabla (ID, color) VALUES (NEWID(),'AMARILLO')
INSERT INTO MiTabla (ID, color) VALUES (NEWID(),'ROJO')

Y seleccionamos los datos a ver que tenemos:

SELECT * FROM MiTabla

Y el resultado:

[caption id="attachment_1398" align="alignnone" width="300"]Ejemplo de tabla con valores unicos Ejemplo de tabla con valores unicos[/caption]

lunes, 6 de agosto de 2012

InfoRadio - Información Para Radio Aficionados

InfoRadio es una aplicación escrita en C# que muestra información de utilidad para Radio Aficionados. Esta información es:

  • Posición de los planetas en el Sistema Solar

  • La visión de la Tierra desde la Luna

  • Condiciones para la propagación en las bandas de HF y VHF

  • Horas de Sol en el mundo

  • Concentración total de electrones


Esta informacion es recolectada desde el sitio web de N0NBH Paul

Link Instalador: http://maximilianomarin.com/almacen/InfoRadio/InfoRadioSetup.exe

Cualquier comentario, sugerencia o problema publicarlo en los comentarios. Gracias.

73's

CD6375 Maximiliano

 

miércoles, 11 de julio de 2012

Algo sobre la funcion YEAR en T-SQL

En T-SQL existen funciones, aparte de los tipos de datos específicos, que permiten manejar y obtener más información sobre determinada fecha.
En este cortísimo post, contaré sobre la función Year.
Tal como su nombre lo indica, esta función permite obtener el año desde una fecha completa.
El modo de funcionamiento es:
YEAR(fecha)
Donde Fecha puede ser un valor con los siguientes tipos de datos: time, date, smalldatetime, datetime, datetime2 o datetimeoffset y el valor devuelto será un int.
Por ejemplo:
De la tabla AdventureWorks seleccionamos los 100 primeros años de despacho de las órdenes de compra
SELECT TOP 100 YEAR(ShipDate) AS [Año de Despacho] FROM Sales.SalesOrderHeader
En esta consulta ShipDate es una columna cuyo tipo de dato es datetime.
Obviamente, a esto se le puede agregar un mayor nivel de complejidad y hacer cosas bastante interesantes en temas de análisis de datos a través del tiempo.

jueves, 5 de julio de 2012

Conocer la versión exacta de SQL Server

Hay algunas aplicaciones que necesitan tener una versión en específica de SQL Server. Voy a que no solo exige una edición, también pide una versión, un service pack o un cumulative update.

Esta información se puede obtener haciendo una simple consulta a la base de datos:
SELECT @@VERSION

Y debiera arrojar algo así:
Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Feb 10 2012 19:39:15
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.2 (Build 8400: )

El numero 11.0.2100.60 corresponde a la versión de SQL Server. Para saber la versión exacta de fácil lectura, hay que buscar el valor en la tabla del siguiente sitio web: http://www.sqlteam.com/article/sql-server-versions

Saludos!

miércoles, 4 de julio de 2012

Simplificando la vida con IN y T-SQL en SQL Server

¿Te complicas mucho la existencia usando operadores lógicos en las consultas a la base de datos? Lo mas probable, es que si lo hagas (Bueno, sino te complica, esto igual te servirá).

El operador OR siempre devolverá un valor verdadero, siempre y cuando uno de sus argumentos sea verdadero.  Se utiliza como predicado del WHERE.  Por ejemplo:

SELECT * FROM MiTabla WHERE Campo1 = 1 OR Campo1 = 2

Simple, ¿no? Ahora que pasaría si tuviera que agregar más OR a mi consulta:

SELECT * FROM MiTabla WHERE Campo1 = 1 OR Campo1 = 2 OR Campo1 = 3 OR Campo1 = 5 OR Campo1 = 10 OR Campo1 = 15 OR Campo1 = 100

Se complica un poco el panorama y queda complicado para la lectura. Para solucionar esta problemática, haremos uso de IN, que, justamente, sirve para simplificar el uso de OR.  El modo de uso es sencillo:

bla bla blaa WHERE Campo1 IN(valor1, valor2, valor3, valorn)

Este ejemplo fue realizado con la base de datos AdventureWorks:

-- Consulta usando OR
SELECT
*
FROM
[Sales].[SalesPerson]
WHERE
[Bonus] = 4100 OR [Bonus] = 2000 OR [Bonus] = 5000 OR [Bonus] = 6700 OR [Bonus] = 3550
ORDER BY
[Bonus] DESC

-- Consulta usando IN
SELECT
*
FROM
[Sales].[SalesPerson]
WHERE
[Bonus] IN(4100,2000,5000,6700,3550)
ORDER BY
[Bonus] DESC


Saludos!

viernes, 29 de junio de 2012

Modelos de cluster: Activo-Pasivo y Activo-Activo

En las organizaciones donde tienen un centro de datos y aplicaciones que requieren alta disponibilidad (HA), nos podemos encontrar con dos tipos de configuraciones de HA:

Activo-Pasivo

En esta configuración existen al menos dos nodos. Uno ofrece el servicio y el otro está a la espera que el nodo 1 deje de funcionar para entregar los servicios que el nodo 1 deja de dar. Cuando el nodo uno está funcionando sin problemas (activo), el segundo nodo está atento (pasivo).

Activo-Activo

Esta configuración, al igual que la anterior, requiere al menos 2 nodos para funcionar. Se diferencia con la primera, en que cada nodo tiene distintos servicios corriendo activamente y en caso de falla, uno de los nodos asume los servicios que prestaba el nodo que falló. Por ejemplo: El servicio de DHCP y File Server están corriendo, activamente, uno en cada nodo, pero pasivamente en el otro nodo. Si el nodo 1 falla, el nodo 2 prestará ambos servicios.

Si yo tuviera que elegir, me quedo con la configuración activo-activo, porque no pierdo los recursos de un servidor que está solo a la espera de que uno falle.  Obviamente todo dependerá del escenario al cual me esté enfrentando.

 

Saludos!

 

 

miércoles, 20 de junio de 2012

Procedimientos Almacenados en SQL Server

Un procedimiento almacenado no es  más que un conjunto de instrucciones T-SQL que puede aceptar varios parámetros de entrada y devolver distintos valores de salida. También puede llamar a otros procedimientos almacenados y, además, incluir una referencia al CLR de .NET.

Usar procedimientos almacenado tiene múltiples ventajas, entre las que destacan:

  • Trafico reducido entre cliente y servidor:  Todas las sentencias se ejecutan en un solo lote de código. Por la red solo viaja el llamado al procedimiento y sus parámetros. No viaja la sentencia completa, porque ya está almacenada en el servidor.

  • Mayor Seguridad: Puede que para ejecutar cierta operación sobre la base de datos se necesiten ciertos privilegios. Para no estar otorgando privilegios sobre la base de daos a los usuarios, se puede especificar que usuario ejecuta las sentencias descritas dentro del procedimiento almacenado. Esto se logra haciendo uso de la clausula EXECUTE AS al momento de crear el procedimiento almacenado.

  • Reutilizar Codigo: Al reutilizar las sentencias y no reescribirlas cada vez que se necesiten, se evitan inconsistencias y se ahorra tiempo.

  • Mantenimiento sencillo:  En el caso de una actualización del modelo de la base de datos  o cualquier modificación de la estructura de esta, no va a ser necesario modificar todas las consultas de la aplicación. Solo se modifican los procedimientos almacenados generando un minimo impacto en la aplicación.

  • Rendimientos mejorados: Una sentencia se compila cada vez que se ejecuta en la base de datos. En cambio, un procedimiento almacenado es compilado una sola vez y se crea un plan de ejecución que se usará cada vez que se hace una llamada al procedimiento almacenado. Se disminuye la carga del servidor.


Para crear un procedimiento almacenado se debe usar la sentencia CREATE PROCEDURE. Por ejemplo:

CREATE PROCEDURE [dbo].[MiProcedimiento]
@genero char(1)
AS
SET NOCOUNT ON
SELECT
[NationalIDNumber],
[OrganizationNode],
[JobTitle],
[MaritalStatus],
[HireDate]
FROM
HumanResources.Employee
WHERE
[Gender] = @genero
GO

En esta porción de código se pueden indicar varias partes:

  1. En la línea 1, se indica que se creará un nuevo procedimiento almacenado y se le otorga un nombre.

  2. Luego vienen los parámetros con sus respectivos tipos de datos.

  3. AS indica que comienzan las instrucciones en t-sql.

  4. SET NOCOUNT ON indica que no se devolverán las filas afectadas. Se puede dejar en OFF si se quiere saber cuantos registros se seleccionaron o cuantos fueron afectados con la operación.

  5. Consulta SQL. Esta consulta trae los nombres de los empleados según el genero.


Para llamar a un procedimiento almacenado, se debe usar la sentencia EXEC. Por ejemplo:


EXEC MiProcedimiento 'M'


Este procedimiento almacenado fue creado en la base de datos AdventureWorks. Pruebalo tu también.

lunes, 18 de junio de 2012

Delete, Truncate y Drop

Delete From, Truncate Table y Drop Table  son sentencias de SQL que sirven para borrar. Existen en todos los motores de base de datos, pero los tres hacen borrados distintos.

Delete From

Esta sentencia DML se utiliza para eliminar registros según condición, o simplemente, borra todos los registros de la tabla.  No es autocommit, registra todo en el log de transacciones y no altera la estructura de la tabla. Tiene a ser un poco ineficiente al registrar todo. Veamos este ejemplo:

A una tabla con 14 registros, le di la siguiente instrucción:

DELETE FROM Tabla1

Ocurrió lo esperado: Eliminó todos los registros de la tabla y no modificó su estructura. Además, registró todo en el log de transacciones y realizó el commit una vez que ejecutó todos los delete

 

[caption id="attachment_1364" align="alignnone" width="233"]Log transaccional de DELETE FROM Log transaccional de DELETE FROM[/caption]

Tomar en cuenta que todo lo que está dentro del cuadrado rojo corresponde a la eliminación de cada uno de los registros de la tabla. Hay una porción destacada en amarillo. Es ahí cuando realiza el commit.

Cuando se elimina un registro en una tabla que tiene un campo como identity el contador nunca más vuelve a usar el registro identity que se eliminó. Por ejemplo:


Numero color
1 blanco
2 rojo
3 azul

y ejecutamos lo siguiente:

DELETE FROM Tabla WHERE Numero = 2

Va a eliminar el segundo registro y al insertar un campo en la base de datos, quedaría así:

Numero color
1 blanco
3 azul
4 amarillo

Al manipular los datos de la tabla, está sujeto a las restricciones de las claves foráneas.

 

Truncate

Truncate Table, sentencia DDL,  elimina todos los registros de la tabla. A diferencia de Delete From, no escribe en el log de transacciones, por lo que no es posible hacer un rollback.  La otra diferencia que tiene con Delete From, es que no ofrece un borrado selectivo y no se le puede pasar un trigget con ON DELETE.
Ejemplo de la imagen:

[caption id="attachment_1365" align="alignnone" width="300"]Ejemplo de Truncate Table Ejemplo de Truncate Table[/caption]

Como se puede ver en la imagen, no registra todos los datos que elimina. Lo único que hace es un deallocate.

 

Al borrar los datos de un tabla que tiene una columna como identity, el contador vuelve a cero. Veamos el ejemplo:


Numero color
1 blanco
2 rojo
3 azul

y ejecutamos lo siguiente:

TRUNCATE TABLE Tabla

La tabla quedará vacía y al insertar un registro quedará así:

Numero color
1 verde

Al eliminar registros con esta sentencia, está sujeto a las restricciones de las claves foráneas.

 

Drop

Sentencia DDL, que se utiliza para modificar la estructura de una tabla, por ejemplo al eliminar una columna de una tabla, o bien, eliminar la tabla completa.  Al eliminar la tabla completa, lo primero que hace es hacer un borrado de los registros con DELETE, hace un commit y al final borra la tabla.  El registro es bastante grande, así que me disculparán por no poner un ejemplo.

Espero que esto les haya servido de ayuda.

viernes, 8 de junio de 2012

Limitar la memoria en SQL Server

SQL Server (al igual de Exchange) son campeones en comerse toda la ram del equipo. Al parecer son servicios hambrientos e insaciables, ya que son capaces de usar toda la memoria física. No importa cuanta memoria tengas, siempre ocupará toda.

Hay una forma de limitar la cantidad de memoria (y es recomendable hacerlo para que el sistema operativo pueda hacer sus otras funciones). Limitar la cantiad de memoria máxima que usa SQL Server no es una tarea compleja. Para esto abriremos el Management Studio e iremos a las propiedades de la instancia:

[caption id="attachment_1358" align="alignnone" width="168" caption="Propiedades de la Instancia"]Propiedades de la Instancia[/caption]

Se debiera abrir una ventana como esta:

[caption id="attachment_1359" align="alignnone" width="300" caption="Propiedades de la instancia"]Propiedades de la instancia[/caption]

Ir a la opcion de "Memoria" tal como aparece en la imagen y mostrará lo interesante:

[caption id="attachment_1360" align="alignnone" width="300" caption="Propiedades uso de memoria"]Propiedades uso de memoria[/caption]

Prestemos atención en el numero: 2147483647  Este número no indica la cantidad de memoria que tenemos, sino que indica la cantidad de memoria, en MB, que puede llegar a ocupar SQL Server. Como excede a lo que tenemos, siempre va a intentar llegar a los más posible y es por esto que siempre ocupa toda la memoria.

Ese numero hay que reemplazarlo por el limite que queremos que tenga SQL Server. En mi caso quiero que solo use 2GB.

[caption id="attachment_1361" align="alignnone" width="300" caption="Limite de memoria"]Limite de memoria[/caption]

Le damos Ok y listo.

 

jueves, 7 de junio de 2012

¿Qué es mejor: select count(*), select count(1) o select count('nombre_columna')?

Constantemente se escuchan discusiones sobre qué método es mejor para saber la cantidad de registros que tiene una tabla. Todos tienen su forma favorita, porque es más eficiente, más rápido y, en definitiva, es mejor.

En lo personal no tengo preferidas, porque en SQL Server (y en Oracle: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1156159920245 ) son exactamente lo mismo.

Mostraré el resultado de cada plan de ejecución estimado para cada caso y verán que son exactamente iguales.

select count(*)

[caption id="attachment_1352" align="alignnone" width="300" caption="select count(*)"]select count(*)[/caption]

select count(1)

[caption id="attachment_1351" align="alignnone" width="300" caption="select count(1)"]select count(1)[/caption]

select count('nombre_columna')

[caption id="attachment_1350" align="alignnone" width="300" caption="select count('nombre_columna')"]select count('nombre_columna')[/caption]

 

Conclusión: Solo es cosa de gustos :)

miércoles, 6 de junio de 2012

Data Viewer en Integration Services

Jugando con SSIS conocí esta herramienta que permite ver los datos que "van pasando" por el proceso de extracción,transformación y carga. Esto es muy util para hacer una verificación a la vista de los datos.

Historia de SQL Server en casi 3 minutos

Un interesante recorrido desde los inicios de SQL Server en este video. Es un video previo al lanzamiento de la última versión, pero nunca está de más conocer como nace esta plataforma de datos.

lunes, 4 de junio de 2012

Error al instalar Powerpivot

Al instalar Powerpivot para Excel 2010 puede que nos de un error parecido a este:

[caption id="attachment_1339" align="alignnone" width="300" caption="Error al instalar PowerPivot"]Error al instalar PowerPivot[/caption]

Este error sucede cuando no se tiene instalado el paquete de Visual Studio 2010 Tools for Office Runtime  Este lo pueden descargar desde: http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=20479 Se instala y problema solucionado.

 

sábado, 2 de junio de 2012

Informacion sobre los objetos de la base de datos en SQL Server

En SQL Server existe un procedimiento almacenado de sistema que permite entregar información sobre cualquier objeto que exista dentro de la base de datos. En Oracle y MySQL existe una instrucción similar  y se llama describe. En SQL Server (y creo que Sybase) se llama sp_help.

A este procedimiento almacenado se le puede o no pasar un parámetro y de esto dependerá del resultado que necesitamos tener. Por ejemplo, si le entregamos como parámentro un tipo de datos, entregará la información del tipo de datos. Si no le pasamos un parámetro, obtendremos una visión general de todos los objetos de la base de datos. Si le entregamos el nombre de una tabla como parámetro, entregará la información de las columnas y así. Obviamente, le podemos pasar como parámetro el nombre de un procedimiento almacenado.

Es más, en base a esto último, podemos ver la información de sp_help:

[caption id="attachment_1336" align="alignnone" width="300" caption="Informacion procedimiento almacenado sp_help"]Informacion procedimiento almacenado sp_help[/caption]

Es demasiada la información que nos entrega, por eso les dejo el link a la documentación oficial:

http://msdn.microsoft.com/es-es/library/ms187335.aspx

 

viernes, 1 de junio de 2012

Nuevo juguete desde China: Contador de Frecuencias

Hoy iba llegando a almorzar a mi departamento y la conserje dice: "Hey, chiquillo, te llegó algo". Yo me sorprendí. Pensé que el contador de frecuencias tomaría más tiempo, pero no fue así.

Al momento de abrirlo, es bien chino su aspecto. Se nota que no es de la mejor calidad, pero cumple su objetivo: Da la frecuencia del dispositivo que transmite.

Lo que me sorprendió, es que el dispositivo reveló que literalmente somos invadidos por las ondas de radio de distintas frecuencias.

 

[caption id="attachment_1330" align="alignnone" width="225" caption="Contador de Frecuencias"]Contador de Frecuencias[/caption]

Un videito funcionando. Lo grabé al revés.

miércoles, 30 de mayo de 2012

Algunos software para programar radios

Hay muchos equipos de radio que es posible programarlos "por mano" y otros que se pueden programar por computador. Programarlos por computador es más cómodo, ya que permite configurar características más avanzadas del equipo. En mi poder tengo los siguientes equipos:

  • Icom IC F3GS

  • HLT-6688 (Imitación Yaesu)

  • Master UV-200 (Imitación Baofeng UV-3R)


Driver
Antes que todo, es necesario instalar este driver si nuestro computador no tiene el puerto serie o RS-232 y si estamos usando Windows XP/Vista/7 Descargar Aquí

Icom IC-F3GS
Funciona perfectamente bajo Windows 7 x64 Descargar Aquí

Master UV-200
Este es la imitación del Baofeng UV-3R, por lo tanto, sirve el mismo programa Descargar Aquí

HLT-6688
En el sitio oficial del fabricante están todos los softwares. El único problema es que el sitio está en chino. Descargar Aquí.

Comodín
Existe otro software que sirve para programar una buena cantidad de equipos. Este programa se llama Chirp y pueden descargar la ultima version Desde aquí. El sitio web es este

Saludos!

martes, 15 de mayo de 2012

Compresión de respaldos con SQL Server

Mayo ha sido un mes movido, por lo menos, para mi. He tenido bastantes actividades, tanto en el trabajo como en mi vida personal, que me tenían un poco privado de tiempo para compartir alguna cosa poca.

Por ejemplo, estuve en Concepción la semana pasada hablando sobre SQL Server (¡Que novedad! ¿o no?) y aprobé el examen para la licencia de radioaficionado. Desde ahora soy CD6375. Supongo que a nadie le importa esto, así que vamos a lo importante.

Comprimir respaldos se realiza por los siguientes motivos:

  • Toma menos tiempo generar uno.

  • Ocupa menos espacio en disco.

  • Si respaldamos en cintas, ocupa menos espacio en cinta, por lo tanto, ocupará menos respaldo en el lugar donde guardemos las cintas.

  • Toma menos tiempo hacer una restauración desde un respaldo.


En este ejemplo solo tocaré la creación de respaldos. Dejemos la cháchara y vamos al choque.


--Estadisticas
set statistics io on
set statistics time on

--Respaldo sin comprimir
backup database AdventureWorks2012_Data
to disk = 'C:Program FilesMicrosoft SQL ServerMSSQL11.MSSQLSERVERMSSQLBackupbak1.bak'
with init, no_compression

--Limpiar caché
dbcc freeproccache

--Respaldo con comprimir
backup database AdventureWorks2012_Data
to disk = 'C:Program FilesMicrosoft SQL ServerMSSQL11.MSSQLSERVERMSSQLBackupbak2.bak'
with init, compression


El script tiene varias partes:

  1. Estadisticas: Activa las estadisticas del servidor para la transaccion.

  2. Respaldo sin comprimir: Crea un respaldo comun y corriente de la base de datos. Respaldo sin tratamiento

  3. Liberar Caché: Limpia la caché.

  4. Respaldo con "comprimir": Crea un respaldo comprimido de la base de datos.


Esto suena muy lindo. Tal para no creer. Veamos algunas imágenes

[caption id="attachment_1318" align="alignnone" width="300" caption="Estadisticas sin comprimir"]Estadisticas sin comprimir[/caption]

 

[caption id="attachment_1319" align="alignnone" width="300" caption="Estadisticas con compresión habilitada"]Estadisticas con compresión habilitada[/caption]

 

[caption id="attachment_1320" align="alignnone" width="219" caption="Propiedades archivo de respaldo sin comprimir"]Propiedades archivo de respaldo sin comprimir[/caption]

 

[caption id="attachment_1321" align="alignnone" width="219" caption="Propiedades archivo de respaldo comprimido"]Propiedades archivo de respaldo comprimido[/caption]

Si no les gusta copiar y pegar, pueden descargar el archivo .sql desde aqui: http://www.4shared.com/document/nN-PRmL1/demo_compresion_respaldos.html

 

lunes, 30 de abril de 2012

Exportar datos de MAP Toolkit

Hola Mundo. Último dia de Abril. En el post anterior conté que conocí a una herramienta bastante potente para hacer inventario dentro de una red. Ésta trabaja sobre un SQL Server 2008 Express, por lo que no se puede conectar a través de SQL Server Management Studio.

En su momento, pensé que iba a tener algunos problemas para exportar la info. Después de bastante rato de intentarlo, llegué a lo siguiente:

Recuerden que estaba haciendo un inventario de SQL Server

  1. Iniciar el servicio de SQL Browser desde el Configuration Manager

  2. Importar datos desde SQL Server. Conectarse a la instancia MAPS. (OJO Piojo. Hay que indicar el nombre del equipo y la instancia. Por ejemplo: Mi máquina se llama SQL2 y la instancia se llama MAPS, entonces debo conectarme a SQL2MAPS)

  3.  Importar las siguientes tablas/vistas: sql_inventory_dbinstance_view, sql_dbinstance_databases_view, sql_databaseserverproperties y sql_databaseproperties


Con esto tendrán la info en un Excel lista para llevar.

 

martes, 24 de abril de 2012

MAP: Microsoft Assessments and Planning

La historia es la siguiente: Estaba en la oficina y me solicitaron que realizara una tarea de inventariado de un grupo de máquinas con SQL Server en una empresa. La verdad es que nunca había hecho esto, ni mucho menos conocía algún software que lo hiciera por mi. Ya me veía anotando en mi libreta todos los SQL Server que estaban funcionando. De ser así, tendría un tedioso día.

El panorama se comenzó a arreglar, cuando se me ocurrió preguntar como lo podía hacer. Una persona, con bastante experiencia en el tema, me dijo que existía MAP: Microsoft Assessments and Planning.

MAP Toolkit es una herramienta que ayuda a hacer inventariados, evaluaciones e informes para pequeñas y grandes empresas sin necesidad de instalar agente en ningún equipo. De este modo las empresas pueden planear de una manera más eficiente la migración de sus sistemas.

Volviendo a la historia, tuve que aprender a usar la herramienta para cumplir el propósito.

Mi memoria es frágil, así que hice un PDF con fotos para que nunca más se me olvide: http://www.4shared.com/office/_NGbSxPM/Microsoft_Assessment_and_Plann.html

jueves, 19 de abril de 2012

Habilitar el acceso remoto a SQL Server 2012

En una organización puede que sea un requerimiento que el servidor esté aislado o puede que no. En el caso que se requiera que se habiliten las conexiones remotas, tenemos que seguir una serie de pasos, ya sean en orden o no.

Permitir las conexiones remotas en la instancia
Abrir SQL Server Management Studio e ir a las propiedades del servidor (botón secundario en el nombre del servidor -> Propiedades). En la ventana de propiedades, ir a las propiedades de conexión y habilitar la opción "Allow remote connections to this server", tal cual como sale en la imagen:

Propiedades de conexion del servidor

Ahora abrimos SQL Server Configuration Manager y verificar que el protocolo TCP/IP para la instancia se encuentre habilitado:

Propiedades de TCP/IP

En la misma ventana, abrimos las propiedades del protocolo TCP/IP y vemos que puerto está utilizando:



Habitualmente utiliza el puerto 1433.

Crear regla en el firewall

Abrimos el firewall de Windows y creamos la siguiente regla:









En esta parte hay que definir el perfil de la regla. En mi caso, quiero que el servidor esté disponible para acceder desde todo el dominio.



Nombre de la regla. Tiene que ser algo descriptivo. Luego finalizamos el asistente.

Para probar la conexión, desde SQL Server Management Studio (idealmente instalado en otro equipo de la organización)  intentamos conectarnos al servidor remoto:



Desde el servidor SQL3 intenté conectarme al SQL1 y todo resultó tal como lo configuré:



Ahora que funciona, ¡A Jugar!