Error al instalar Powerpivot

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

Error al instalar PowerPivot
Error al instalar PowerPivot

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.

 

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:

Informacion procedimiento almacenado sp_help
Informacion procedimiento almacenado sp_help

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

 

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!

Demo de ColumnStore Index

Hola gente linda, en el post del 30 Marzo ( http://blog.maximilianomarin.com/2012/03/columnstore-index/ ) escribí sobre esta nueva característica. Debo reconocer que quedé con gusto a poco y ahora hice algo más elaborado. Algo que ustedes puedan descargar y probar en sus máquinas y sacar sus propias conclusiones.

Pueden descargar el archivo desde aquí: http://www.4shared.com/zip/SIaGozP_/Demo_ColumnStore_Index.html y ponerse a jugar.

Se aceptan sugerencias.

Hablemos sobre Filestream en SQL Server

En una base de datos podemos almacenar datos estructurados y datos no estructurados. Los datos estructurados corresponden a los que están fuertemente tipados. Por ejemplo, los que se almacenan del tipo int, float, etc. En cambio, tenemos los no estructurados que se almacenan como objetos, usualmente llamados blob (Binary Large OBject).

Todos los motores de bases de datos tienen la capacidad de  almacenar binarios, pero SQL Server ofrece una funcionalidad (incluida en la versión 2008) llamada Filestream  que permite almacenar los objetos binarios directamente en el sistema de archivos, pero transparente para el usuario. Por lo que se pueden seguir ejecutando transacciones sobre estos registrosm esto permite un acceso más rápido a dicha información, y adicionalmente, permite poder liberar de carga de memoria a SQL Server, ya que para el acceso a datos FILESTREAM podría no utilizarse el Buffer Pool.

Para habilitar Filestream en la instancia de SQL Server (si es que no se activó en la instalación) se debe abrir  SQL Server Configuration Manager, ir a SQL Server  Services  (Yo lo tengo en Inglés) y abrir las propiedades de la instancia. En las ventana de propiedades, ir a la pestaña de Filestream y veremos algo así:

 

Configuracion de Filestream
Configuracion de Filestream

Una vez de que la característica esta activada, aceptamos, aplicamos y reiniciamos el servicio. Abrimos el Management Studio, seleccionamos la base de datos en la cual queremos activar Filestream y escribimos lo siguiente:

EXEC sp_configure filestream_access_level, 2

RECONFIGURE

Para poder empezar a usar filestream es necesario crear un filegroup que contenga el atributo CONTAINS FILESTREAM. Para eso, utilizaremos este código:

ALTER DATABASE MiDB
ADD FILEGROUP MiDB_filegroup_filestream CONTAINS FILESTREAM
GO
ALTER DATABASE MiDB
ADD FILE
(
NAME= ‘MiDB_filestream’,
FILENAME = ‘C:dbfs’
)
TO FILEGROUP MiDB_filegroup_filestream
GO

Es importante que el directorio c:db esté creado. El directorio fs dentro de C:db lo creará SQL Server. Para crear la tabla que «almacenará» nuestro objeto, es necesario que una columna sea del tipo VARBINARY(MAX).

create table fs
(
id uniqueidentifier rowguidcol not null unique,
archvo varbinary(max) filestream null
)

Con la tabla ya creada, ya es posible guardar algo. Por ejemplo:

–Declarar la variable del ID
DECLARE @ID UNIQUEIDENTIFIER
–Genera un valor unico
SET @ID = NEWID()
–Inserta un blob en la base de datos. En este caso, es un video. OJO Pijo que hace un cast a la ruta del archivo.
INSERT INTO dbo.fs
(ID, archvo)
VALUES
(@ID, CAST(‘E:Windows Server 2008 R2Wildlife.wmv’ AS VARBINARY(MAX)))
–Selecciona el registro recien creado y muestra su ruta
SELECT ID, archvo
FROM dbo.fs
WHERE ID = @ID
SELECT archvo.PathName()
FROM dbo.fs
WHERE ID = @ID

Y nos debiera dar un resultado mas o menos así:

Resultado de Insercion de datos con Filestream

Mas informacion:
http://technet.microsoft.com/es-es/library/cc645923.aspx
http://www.mssqltips.com/sqlservertip/1489/using-filestream-to-store-blobs-in-the-ntfs-file-system-in-sql-server-2008/
http://www.guillesql.es/Articulos/Almacenamiento_FILESTREAM_SQLServer.aspx

Feliz Pascua de Resurrección!

Compresión en SQL Server

Desde SQL Server 2008 es posible comprimir los datos a nivel de filas y páginas y respaldos. En este pequeño artículo hablaré sobre la compresión a nivel de filas. Para páginas y respaldos vendrán en otra entrega.

Compresión en Filas
La compresion de filas está recomendada cuando se tiene una alta carga de trabajo de escritura en disco. Es posible comprimir las filas en los siguientes escenarios:

  • Tablas con y sin indices agrupados y no agrupados
  • Vistas indexadas
  • Indices y tablas particionadas

Recomendaciones

  • Evaluar el ahorro que se genera con la compresion
  • No comprimir todos los elementos de la base de datos sin antes evaluar. Si es pequeño no es necesario comprimir. Considerar comprimir si el elemento es accesado pocas veces.

Código


--tamaño de tabla
exec sp_spaceused MiTabla
go
--compresion por fila
alter table MiTabla rebuild with(data_compression = row)
go
exec sp_spaceused MiTabla
go

Primero muestra el espacio utilizado por la tabla que vamos a comprimir, luego la comprime y al final muestra el espacio ocupado por la tabla ya comprimida para comparar.

Al realizar esta prueba, nos da el siguiente resultado sobre una tabla sin comprimir:

Tabla sin comprimir
Tabla sin comprimir

Pero al comprimir por fila la misma tabla, nos da el siguiente resultado:

Tabla comprimida
Tabla comprimida

Los números hablan solos.

 

Saludos!

 

ColumnStore Index

Casi un mes de ausencia, pero he vuelto »  totalmente reformado fino, culto y educado y agradecido de haber encontrado el sendero abandonado , con un trema bastante interesante y útil que se puede aprovechar en la nueva versión de SQL Server. Esto es ColumnStore Index.

ColumnStore Index funciona de una forma muy sencilla. Se encarga de indizar columnas en páginas distintas, lo que hace que se incremente el rendimiento de la consulta.

En las imágenes de ejemplo, se puede ver una tabla almacenada en una página. En la segunda imagen se ve una tabla con índices columnares. Es justamente así como trabaja este tipo de índices. Cada columna se indiza en páginas distinas, acelerando las consultas y disminuyendo el uso de los recursos del sistema.

Para implementar indices columnares, se debe usar esta sentencia:

CREATE NONCLUSTERED COLUMNSTORE INDEX MiIndice ON MiTabla
(
Columna1,
Columna2,
ColumnaN,
Columna16
)

Vean estos dos escenarios y se darán cuenta de la potencia de este tipo de indices.

Consulta sin ColumnStore Index
Fijarse en el Estimated I/O Cost
Fijarse en el Estimated I/O Cost
Fijarse en el Estimated I/O Cost

Saludos!

 

Imágenes sacadas desde: http://sql-articles.com/articles/general/columnstore-indexsql-server-2011/

Replicar tabla en SQL Server

Hola Gente, después de  un mes de desaparición total, he vuelto con la respuesta a una problemática que se da muchas veces.

El problema es el siguiente: Replicación de una tabla

Tenemos dos soluciones para esto:

Replicar solo la estructura

SELECT * INTO TablaDeDestino FROM TablaDeOrigen WHERE 1 = 2

Replicar estructura y datos

SELECT * INTO TablaDeDestino FROM TablaDeOrigen

Con esto, no se copian los constraints ni los índices.

 

¡Saludos!

Respaldar Certificado en SQL Server

Hola gente, el día 14 de febrero publiqué un post pequeño sobre Cifrado de bases de datos en el que hablaba, justamente, como cifrar bases de datos. En el proceso creaba una master key y un certificado. En este pequeño post crearé un backup del certificado para que luego pueda ser importado en otra base de datos.

En una base de datos creada para este propósito, creé un certificado de esta manera:


USE TEST_Certificado;
CREATE CERTIFICATE MiCertificado_TEST
ENCRYPTION BY PASSWORD = '123456'
WITH SUBJECT = 'Prueba de Certificado',
EXPIRY_DATE = '20121031';
GO

El certificado fue creado en la base de datos TEST_Certificado y el certificado se llama MiCertificado_TEST. La clave es super segura y expira el 31 de octubre de este año.
En una nueva ventana de consultas, utilicé este código para respaldar el certificaco en el directorio que se indica:

USE TEST_Certificado
BACKUP CERTIFICATE MiCertificado_TEST TO FILE='C:Program FilesMicrosoft SQL ServerMSSQL11.MSSQLSERVERMSSQLBackupMiCertificado_TEST';
GO

Tambien se puede exportar certificado con clave privada con su respectiva clave de descifrado:

BACKUP CERTIFICATE MiCertificado_TEST TO FILE = 'C:Program FilesMicrosoft SQL ServerMSSQL11.MSSQLSERVERMSSQLBackupMiCertificado_TEST_2'
WITH PRIVATE KEY (DECRYPTION BY PASSWORD='123456', FILE = 'C:Program FilesMicrosoft SQL ServerMSSQL11.MSSQLSERVERMSSQLBackupMiCertificado_TEST_k' ,
ENCRYPTION BY PASSWORD = '123456' );
GO

No te pierdas la próxima entrega, en la cual mostraré como importar un certificado.

Saludos

Cifrando base de datos con TDE

Transparent Data Encryption es una característica que está disponible en SQL Server desde la versión 2008 y, obviamente, estará disponible en la futura versión 2012.

TDE realiza encriptacion y desencriptación de datos en tiempo real de los archivos de la base de datos (físicos) y de los archivos de log. La encriptación utiliza una clave de encriptación de base de datos (Desde ahora en adelante, DEK) que es almacenada en el registro de arranque de la base de datos, para que pueda estar disponible durante una recuperación.

Ejemplo:

Se tiene una base de datos llamada Prueba  con una tabla llamada Registro y tiene los siguientes datos:

Datos de la tabla Registro
Datos de la tabla Registro

Si realizo un respaldo de la base de datos:

  • Botón secundario en la base de datos
  • Tasks -> Back Up…

Y navego hasta la ruta C:Program FilesMicrosoft SQL ServerMSSQL11.MSSQLSERVERMSSQLBackup y abro el respaldo que recién generé con el bloc de notas, puedo encontrar la información:

<>Vista en Notepad
Vista en Notepad

Se puede ver los datos almacenados. Es más, entrega mucha información relevante sobre el sistema.

Ahora encriptemos la base de datos ( y de pasada, borramos el respaldo anterior). Para encriptar la base de datos se siguen los siguientes pasos:

  1. Crear la master key
  2. Crear u obtener un certificado protegido por la master key
  3. Crear un DEK y protegerla con el certificado
  4. Setear la base de datos para la encriptación.


USE master;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD='Password@1';
GO
CREATE CERTIFICATE MiCertificado WITH SUBJECT='Mi certificado DEK';
GO
USE prueba;
GO
CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_128 ENCRYPTION BY SERVER CERTIFICATE MiCertificado;
ALTER DATABASE Prueba SET ENCRYPTION ON;
GO

TDE cifra hasta los respaldos que se pueden generar. Al crear uno y abrirlo con el notepad y buscar algun registro (como en el ejemplo anterior), arrojará un error:

Vista desde notepad del respaldo de una base de datos cifrada
Vista desde notepad del respaldo de una base de datos cifrada

Cabe recordar, que este proceso es transparente para las aplicaciones que funcionan sobre SQL Server.

Saludos!