miércoles, 16 de julio de 2008

Materiales de la sesión SQL Server 2008 Jumpstart

He publicado bajo el blog de la compañía, tanto los materiales como las demos utilizadas en el Jumpstart de SQL Server 2008.

Podéis encontrar toda la información y los links de descarga en la siguiente entrada:

http://blogs.solidq.com/ES/ElRinconDelDBA/Lists/Posts/Post.aspx?ID=82

miércoles, 9 de julio de 2008

Actualización de seguridad para SQL Server

Ayer día 8 de Julio y como segundo martes de cada mes, Microsoft publicó una serie de actualizaciones para sus productos. Entre ellos se encontraba una actualización de seguridad de un producto que pocas veces estamos acostumbrados a encontrar, SQL Server.

Dicha actualización se aplica no solo a SQL Server 2005 SP2, sino incluso a SQL Server 7 SP4 y SQL Server 2000 SP4. Corrige errores calificados como "importantes" dado que permiten la elevación de privilegios en función de la edición de SQL Server y el tipo de ataque entre estos:

  • Memory Page Reuse Vulnerability - CVE-2008-0085
  • Convert Buffer Overrun - CVE-2008-0086
  • SQL Server Memory Corruption Vulnerability - CVE-2008-0107
  • SQL Server Buffer Overrun Vulnerability - CVE-2008-0106

En el caso de SQL Server 2005, la actualización nos dejará el motor en el nº de versión 9.0.3068

El boletín oficial donde podéis encontrar la descripción técnica lo podéis leer aquí.

SQL Server 2008 Jumpstart Barcelona

Salvador Ramos para la parte de BI y un servidor nos vamos a encargar de impartir las sesiones del próximo SQL Server 2008 Jumpstart en Barcelona los próximos dias 14 y 15 de Julio.

Durante dos dias, repasaremos las novedades y mejoras que aparecen en SQL Server 2008 tanto en el apartado relacional, como en el de inteligencia de negocio.

jueves, 5 de junio de 2008

GUSENET: Estamos en la nube

El próximo viernes 13 de Junio, volvemos a reunirnos en GUSENET para aprender mas y mas cosas sobre este maravilloso mundo de la tecnología. En esta ocasión aprenderemos de la mano de dos amigos míos, Pedro Hurtado y Miguel Llopis que desde luego tienen mucho que contarnos

La agenda es la siguiente

16:00 - 16:30  Registro
16:30 - 17:45  Desarrollo avanzado de controles (Pedro Hurtado)
17:45 - 18:15  Descanso
18:15 - 19:30  SOA, OSLO, SAAS...  (Miguel Llopis)

Esta vez nos reuniremos en la Universidad de Murcia y para asistir te recomiendo que te registres aquí porque hay premios varios...¿que será esta vez?

miércoles, 4 de junio de 2008

Webcasts grabados disponibles

Como seguro que sabreis, Solid Quality Mentors esta siendo la encargada de realizar los webcasts de la nueva versión de la plataforma de datos de microsoft SQL Server 2008. Pues bien, ya estan colgados los tres primeros webcasts para su visionado a traves de Windows Media Player.

Aquí os dejo los enlaces:

Que los disfruteis.

martes, 27 de mayo de 2008

Webcast: SQL Server 2008 Novedades para Desarrolladores

De nuevo, tengo el honor de impartir un nuevo Webcast de la serie de SQL Server 2008 para Microsoft Technet. En este caso voy a centrarme en las novedades que trae SQL Server 2008 para desarrolladores. Entre otras cosas voy a hablar sobre mejoras en T-SQL, la sentencia MERGE para que podamos por fin realizar "UPSERTS" desde T-SQL ;), paso de parámetros de tipo tabla, nuevos tipos de datos y mejoras en tipos de datos existentes,...en fin que no te lo puedes perder.

Para suscribirte aquí te dejo la URL: https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032375829&EventCategory=4&culture=es-ES&CountryCode=ES 

Te espero el próximo jueves día 29 de Mayo a las 16h (hora española)

jueves, 22 de mayo de 2008

Webcast: Como controlar el rendimiento de tu SQL Server 2008

Ya se anunció en este post de la existencia de varios webcast sobre SQL Server 2008 que vamos a impartir desde Solid Quality Mentors para Microsoft Ibérica; esta tarde voy a impartir el webcast "Como controlar el rendimiento de tu SQL Server 2008". Voy a hablar sobre Resource Governor, Performance Studio y el bloqueo de planes de ejecución de forma persistente en memoria "no volatil".

Si deseas subscribirte aqui tienes la url:

http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032375468&EventCategory=4&culture=es-ES&CountryCode=ES 

Os espero!

viernes, 16 de mayo de 2008

Virtual PC 2007 SP1

Microsoft acaba de publicar el service pack 1 para su Virtual PC 2007.

Entre sus novedades destacan la mejor compatibilidad con los hosts Windows Vista SP1 y la versión standard de Windows Server 2008, así como en los guest con Windows Vista SP1 y Windows XP SP3

Los estados guardados de vuestras máquinas virtuales son incompatibles entre Virtual PC 2007 y Virtual PC 2007 SP1 por lo que recomiendo que os los cargueis. Además no podéis tener abierto (como es lógico) ninguna máquina virtual ni en Virtual PC ni en Virtual Server para realizar la instalación.

Descarga:https://www.microsoft.com/downloads/details.aspx?FamilyID=28c97d22-6eb8-4a09-a7f7-f6c7a1f000b5&displaylang=en 

Release Notes: http://www.microsoft.com/downloads/details.aspx?FamilyID=9f3d3eb5-5e03-4712-999c-e96f91bdf128&displaylang=en

Claves ajenas no confiables

Una clave ajena (FK) es una columna o combinación de columnas que se utiliza para establecer y exigir un vínculo entre los datos de dos tablas. Es posible definir una clave ajena mediante la definición de una restricción FOREIGN KEY cuando se crea la tabla, o mediante un comando ALTER TABLE ADD COLUMN.

Por ejemplo, la tabla “Maestro” de la imagen posee una clave primaria denominada id, mientras que la tabla “Esclavo” posee una relación lógica con “Maestro” a través de la columna fk_maestro. La columna fk_maestro entonces es designada como la clave ajena de Esclavo hacia Maestro.

image

La restriccion FOREIGN KEY en nuestro caso, establece y exige dicho vínculo de datos forzando a que no sea posible introducir un valor en fk_maestro, que no exista en la columna id de la tabla Maestro. Gracias a ello, el motor de base de datos puede generar planes de ejecución óptimos.

Una cosa que tenemos que conocer es que una restricción FOREIGN KEY soporta que se introduzcan valores NULL pero que cuando estamos ante una clave FOREIGN KEY compuesta por varias columnas y en una de ellas se introduce un NULL, se omite la comprobación de los valores que componen la restricción FOREIGN KEY. Por tanto, es buena práctica especificar NOT NULL en todas las columnas que participan en la misma.

Cuando una clave ajena se encuentra marcada como “confiable”, se garantiza que todas las filas de la tabla cumplen la restricción de clave ajena y se ayuda al planificador a generar un plan de ejecución mas efectivo. Vamos a verlo con un ejemplo que utiliza las dos tablas de la imagen anterior:

SET NOCOUNT ON
DROP TABLE dbo.Esclavo;
DROP TABLE dbo.Maestro;
GO
-- creacion de tablas con tipica relacion maestro-esclavo
CREATE TABLE dbo.Maestro(
id INT IDENTITY (1,1) primary key,
v int
)
create table dbo.Esclavo(
id int identity(1,1),
fk_maestro int --foreign key references Maestro(id)
)
Go

-- Añado la relación, por defecto es confiable y activada
--
alter table dbo.Esclavo add constraint fk_esclavo_maestro foreign key (fk_maestro) references Maestro(id)
GO
-- inserto 1000 filas
--
DECLARE @i INT
SET @i=0

WHILE @i < 1000
BEGIN
INSERT dbo.Maestro (v) VALUES (@i)
SET @i=@i+1
END
GO

-- inserto en esclavo datos válidos apuntando al maestro
insert into dbo.Esclavo (fk_maestro)
select id from dbo.Maestro
GO

-- esto obviamente da error por la clave ajena
insert into dbo.Esclavo (fk_maestro) values (20000)

-- deshabilito el check, porque queremos realizar un bulk insert , por ejemplo
ALTER TABLE dbo.Esclavo WITH noCHECK noCHECK CONSTRAINT fk_esclavo_maestro

-- vemos el estado no confiable y que ademas no se comprueba la restriccion
--
SELECT name as [Nombre FK],object_name(parent_object_id) as Tabla, schema_name(schema_id) as [Schema Name],is_not_trusted,is_disabled
FROM sys.foreign_keys


-- ahora me deja hacer el insert, pese a ser inválido el valor en el esclavo
--
insert into dbo.Esclavo (fk_maestro) values (20000)

-- ahora vuelvo a habilitar el check, pero marcando que no se comprueben los datos anteriores, sino para los nuevos
--
ALTER TABLE dbo.Esclavo WITH noCHECK CHECK CONSTRAINT fk_esclavo_maestro

-- ahora esta como not trusted , pero a partir de ya, se vuelven a comprobar las fk
--
SELECT name as [Nombre FK],object_name(parent_object_id) as Tabla, schema_name(schema_id) as [Schema Name],is_not_trusted,is_disabled
FROM sys.foreign_keys

-- ahora ya no me deja insertar basura
insert into dbo.Esclavo (fk_maestro) values (20001)


SET STATISTICS IO ON


-- con disabled y not_trusted
-- Table 'Maestro'. Scan count 0, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
-- Table 'Esclavo'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
--
select fk_maestro from dbo.Esclavo e inner join dbo.Maestro m on m.id = e.fk_maestro and fk_maestro >1001


-- SI AHORA HABILITAMOS Y LO VOLVEMOS A PONER COMO TRUSTED, YA NO SE CONSULTA A
-- MAESTRO, con la consiguiente mejora de rendimiento
-- primero hemos de borrar la basura
delete from dbo.Esclavo where fk_maestro > 1000
ALTER TABLE dbo.Esclavo WITH CHECK CHECK CONSTRAINT fk_esclavo_maestro
-- Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
-- Table 'Esclavo'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
-- 
select fk_maestro from dbo.Esclavo e inner join dbo.Maestro m on m.id = e.fk_maestro and fk_maestro >1001




Vemos en el ejemplo como si tenemos la clave FOREIGN KEY como confiable, no es necesario que SQL Server consulte contra la tabla Maestro para resolver la consulta. Si la clave está como no confiable evidentemente se incurre en una penalización de rendimiento que en todo caso y ahora que sabemos que existe, querremos evitar siempre.

Las restricciones marcadas como “no-confiables” lo están porque o bien se han creado con la marca “WITH NOCHECK” , o bien se han deshabilitado en algún momento manualmente por un proceso de carga masivo o de replica.

No vamos a poder marcar la clave ajena como “confiable” hasta que no habilitemos la clave ajena con comprobación de datos previos, y esto se hace de la siguiente manera:

alter table Tabla with check CHECK CONSTRAINT NOMBRE_FK

Nota: Al lanzar esta sentencia, se comprobaran las restricciones de clave ajena para los datos ya insertados con lo que si existe algún dato inválido no se va a activar, teniendo nosotros que solucionar la inconsistencia para poder continuar.

jueves, 8 de mayo de 2008

Recorrido avanzado en SQL Server Enterprise Edition

En la versión Enterprise de SQL Server, hay una característica poco conocida pero muy util en sistemas donde existen recorridos de tabla (si, los temidos table scans ;). El hermano mayor de SQL Server posee la característica de permitir que varias tareas compartan recorridos de tabla completos.Si el plan de ejecución de una instrucción T-SQL requiere un recorrido de las páginas de datos de una tabla y el motor de base de datos detecta que la tabla ya se recorre en otro plan de ejecución, se combina el segundo recorrido con el primero, en la ubicación actual del segundo. De esta forma, se lee cada página una vez y pasa las filas de cada página a ambos planes de ejecución. Esto continúa hasta que se llega al final de la tabla.

Esto repercute directamente en una mejora drástica del uso de los dispositivos E/S puesto que en lugar de que dos o mas hilos lean cada uno las mismas páginas, se leen solo una vez y se comparten por el resto, lo que evita en la medida de lo posible la contención en el brazo del disco físico y la competición por espacio en buffer.

image

Según lo que acabo de comentar, si el hilo B ya ha recorrido las páginas 504-528 y entra a recorrer el hilo A, la misma tabla, se unirá por donde se encuentra B leyendo, para reutilizar las lecturas, compartiéndolas ambas...pero cuando finalicen de leer la página 576, el proceso A volverá al principio para leer la información de las páginas 504-528, puesto que este proceso no las había leído.

Además, con esto se demuestra también por qué a menos de usar order by, no se puede garantizar NUNCA el orden de los resultados devueltos por una consulta.

lunes, 5 de mayo de 2008

SQLU Summit 2008!

La semana del 23 al 27 de Junio en Madrid, Solid Quality Mentors vuelve a proporcionarte otra semana con el mayor y mejor conocimiento técnico de la plataforma de datos de Microsoft. Este año tendremos tres tracks simultáneos: SQL Server, Business Intelligence y Desarrollo. ¡No te lo pierdas!

Para ampliar información pincha aquí

miércoles, 30 de abril de 2008

Serie de webcasts sobre SQL Server 2008

Si estas subscrito a los boletines de Microsoft, habrás recibido un correo en el que te informan de una serie de webcasts gratuitos sobre el nuevo SQL Server 2008.

Solid Quality Mentors ha sido la elegida para realizar estos webcasts donde repasaremos todas las novedades tanto en el motor relacional, como en el ámbito de la inteligencia de negocio. Son sesiones altamente recomendables en las que vas a poder prepararte para la nueva oleada de aplicaciones de acceso a datos, viéndola desde el lado del servidor de base de datos. Aprenderás a cómo conseguir un rendimiento predecible del motor, a cómo realizar DataWarehouses de alto rendimiento, cómo diseñar aplicaciones de nueva generación, cómo administrar de forma eficiente grupos de servidores,...

Aqui teneis la agenda de los próximos webcasts:


Para más información, visita la web oficial sobre las jornadas pinchando aqui.

Por cierto, yo mismo voy a impartir los webcasts de "Declarative Management Framework", "Aplicaciones de Nueva Generación" y "Novedades para Desarrolladores".

NOTA: Rubén Garrigós ya realizó la semana pasada el webcast sobre novedades para DBA´s en SQL Server 2008. Puedes descargarte la documentación y el propio vídeo desde aquí

GUSENET: SQL Server 2008

El siguiente evento previsto para el grupo de usuarios GUSENET va a volver a estar dedicado a la plataforma de datos. Por un lado, yo mismo voy a dar una sesión sobre las novedades en SQL Server 2008 enfocadas a los administradores de bases de datos, mientras que Eladio Rincón va a hablar sobre la detección de problemas de rendimiento en SQL Server 2005.

Ambas sesiones son bastante recomendables, la primera porque con la profesión que hemos elegido viene intrínseca la necesidad de saber siempre cosas nuevas…y la segunda es todavía más recomendable puesto que nos mostrará un mundo nuevo dentro de SQL Server 2005 con el que aprenderemos a comunicarnos con el motor de BBDD y a decirle que nos hable sobre sus dolencias y como resolverlas ;)

Aquí os dejo la agenda del evento:

16:00 - 16:30  Bienvenida y registro

16:30 - 17:45  Novedades en SQL Server 2008 para administradores
                     (Enrique Catala)

17:45 - 18:15  Descanso

18:15 - 19:30  Detección de problemas de rendimiento en SQL Server 2005    
                     (Eladio Rincón)

Para más información: www.gusenet.com

Aquí os pongo el link de registro: http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032378512&Culture=es-ES

Office Visio 2007 Professional SQL Server Add-in

Microsoft acaba de publicar un addin imprescindible para los DBA´s de SQL Server. Hoy me ha dado una alegria al ver lo facil que nos lo han puesto los chicos de Microsoft a los que nos dedicamos a esto de las bases de datos ;)

Con este addin, podemos generar facilmente y con la ayuda de un asistente, topologias complejas de SQL Server. Incluye incluso la posibilidad de plantear topologias con los nuevos SQL Server 2008 (todavia en CTP6) y Windows Server 2008 hyper-v (recientemente liberado)

En la zona de descarga (link) podemos tanto instalarnos el addin, como descargarnos un documento donde nos explica paso a paso como utilizarlo.

Tan solo os dejo dos imágenes para abrir boca

Untitled

y una muestra de informe resultado

Untitled

Visual Studio 2008 Express Editions ya disponibles

Microsoft ha hecho por fin oficial el lanzamiento de las versiones express de Visual Studio 2008, incluido en castellano. Nos dan la posibilidad de realizar instalacion web, offline, bajarnos el conjunto completo (incluido SQL Server 2005 express), versión de MSDN Express, documentación variada...

Sin duda una buena noticia para todos aquellos que quieren iniciarse con Visual Studio 2008 y no sabian por donde empezar ;)

https://www.microsoft.com/express/

Untitled

martes, 29 de abril de 2008

Convertir valores hexadecimales a uniqueidentifier

Es un problema poco frecuente, pero sí posible (mas adelante explicaré un caso real), que necesitemos convertir un valor hexadecimal a su representación uniqueidentifier.

Pongamos por caso, que disponemos del siguiente valor hexadecimal: 0xAF410B348743A84395FA5F37A3C32C8A. Si queremos obtener su representación uniqueidentifier, lo que tenemos que hacer es un simple cast de esta forma:

select convert(uniqueidentifier,0xAF410B348743A84395FA5F37A3C32C8A)

El valor uniqueidentifier que lo representa, dado al resolver la consulta, es el siguiente: 340B41AF-4387-43A8-95FA-5F37A3C32C8A

Como vemos, no hay problema alguno en realizar la conversión...salvo que el valor que estamos convirtiendo es un valor hexadecimal que puede que no tengamos almacenado en formato binario, sino como cadena de texto. Si el valor hexadecimal lo tenemos almacenado en una variable de tipo varchar, ya no es tan sencillo hacer la conversión:

Ejecutar la sentencia

select convert(uniqueidentifier,'0xAF410B348743A84395FA5F37A3C32C8A')

Nos lanzará este fantástico error:

Msg 8169, Level 16, State 2, Line 1
Conversion failed when converting from a character string to uniqueidentifier.

Podemos pensar (como es lógico), que lo suyo es convertir el valor primero a un tipo de datos binario (varbinary), y de este ya a su representación uniqueidentifier con el cast correpondiente.

Si lanzamos entonces la sentencia:

select convert(varbinary,'0xAF410B348743A84395FA5F37A3C32C8A')

Nos damos cuenta que el resultado no se parece en nada al valor que teníamos, y por tanto la conversión de este a uniqueidentifier no será válida:

select convert(uniqueidentifier,convert(varbinary,'0xAF410B348743A84395FA5F37A3C32C8A'))

Su resultado es 46417830-3134-4230-3334-383734334138, que no se parece ni de casualidad al valor correcto 340B41AF-4387-43A8-95FA-5F37A3C32C8A.

El proceso pues, requiere que transformemos "a manita" el valor hexadecimal almacenado en la cadena de texto, a su representación varbinary.

Para ello lo que debemos hacer es crearnos una función para tal fin, como puede ser esta:

 
ALTER FUNCTION [dbo].[HexStrToVarBin](@hexstr varchar(8000))
RETURNS varbinary(8000)
AS
BEGIN
DECLARE @hex char(2), @i int, @count int, @b varbinary(8000)
SET @count = LEN(@hexstr)
SET @b = CAST('' as varbinary(1))
IF SUBSTRING(@hexstr, 1, 2) = '0x'
SET @i = 3
ELSE
SET @i = 1
WHILE (@i <= @count)
BEGIN
SET @hex = SUBSTRING(@hexstr, @i, 2)
SET @b = @b +
CAST(CASE WHEN SUBSTRING(@hex, 1, 1) LIKE '[0-9]'
THEN CAST(SUBSTRING(@hex, 1, 1) as int)
ELSE CAST(ASCII(UPPER(SUBSTRING(@hex, 1, 1)))-55 as int)
END * 16 +
CASE WHEN SUBSTRING(@hex, 2, 1) LIKE '[0-9]'
THEN CAST(SUBSTRING(@hex, 2, 1) as int)
ELSE CAST(ASCII(UPPER(SUBSTRING(@hex, 2, 1)))-55 as int)
END as binary(1))
SET @i = @i + 2
END
RETURN @b
END


Una vez teniendo la función, ya podremos realizar la conversión tranquilamente:

select convert(uniqueidentifier,dbo.HexStrToVarBin '0xAF410B348743A84395FA5F37A3C32C8A'))

Por otro lado, el proceso contrario, es decir, convertir de varbinary a valor hexadecimal como cadena de texto lo podemos hacer con la función no documentada fn_varbintohexstr() que espera como argumento de entrada un valor hexadecimal (varbinary) y devuelve su misma representación, pero como cadena de texto.


SELECT master.dbo.fn_varbintohexstr(0xAF410B348743A84395FA5F37A3C32C8A)

El caso real del que os hablaba al principio es el de que querais realizar un join de la información proveniente de sysprocesses con tablas de información de jobs como por ejemplo sysjobs. En ese caso no tendreis mas remedio que realizar estas conversiones dado que en sysprocesses los identificadores de los jobs se encuentran en valor hexadecimal, mientras que los identificadores de las tablas de sysjobs (y sucesivas) se encuentran como uniqueidentifier.

domingo, 27 de abril de 2008

Seminario "Maximice el potencial de su servidor SQL Server"

Los pasados dias 23 y 24 de Abril, realizamos dos seminarios en las oficinas de Microsoft Barcelona y Microsoft Ibérica en Madrid en la que hablábamos de las características que podemos aprovechar para exprimir a tope nuestro motor de base de datos preferido...SQL Server ;)

Nos centramos principalmente en características avanzadas como vistas indexadas, mirroring asíncrono + instantaneas de bases de datos, las ventajas de la indexación con columnas incluidas, particionado de datos y escalabilidad y rendimiento en inteligencia de negocio.

Las presentaciones las hemos subido a esta web para que los asistentes puedan disponer de ellos tal y como se anunció:

lunes, 14 de abril de 2008

Liberar el espacio ocupado por la instalacion del SP1 de Windows vista

Seguro que una vez has instalado el SP1 de Windows Vista decides ya no volverlo a desinstalar. Puesto que este va a ser el caso, te recomiendo que lances el ejecutable vsp1cln.exe.

vistacleanup

Una vez lanzado, se habran liberado mas de 1.5Gb de archivos de desinstalación del service pack, ahorrándote espacio valioso de tu disco duro.

Entre otras cosas, notarás que si usas un portatil se ha deshabilitado la opción de hibernar. Para poder volver a tener la opción activa has de hacer dos cosas:

  1. Abrir un cmd.exe como administrador y teclear "powercfg -h on"
  2. Desactivar la suspensión hibrida: Opciones de energia->cambiar configuracion delplan->cambiar config avanzada

Dicho esto, volverás a disponer de tu valioso botoncito de "hibernar".

miércoles, 9 de abril de 2008

Trabajar con SQL Server 2008 desde Visual Studio 2008

Por defecto, si intentamos crear una conexión desde Visual Studio 2008 hacia SQL Server 2008, nos da un error avisándonos de que "La versión del servidor no es compatible. Se admiten sólo servidores hasta Microsoft SQL Server 2005".

Microsoft ha publicado el siguiente parche CTP para que podamos probar las características nuevas de SQL Server 2008 desde Visual Studio 2008 con sus drivers nativos. En ese caso lo que tendreis que hacer es bajaros el siguiente parche: http://support.microsoft.com/kb/945855

NOTA: Para poder conectar desde Visual Studio 2005 tambien existe un parche CTP para probar: http://www.microsoft.com/downloads/details.aspx?FamilyID=e1109aef-1aa2-408d-aa0f-9df094f993bf&displaylang=en

martes, 8 de abril de 2008

Novedades en SQL Server 2008

Hola a todos, solo comentaros que vamos a dar un compañero de Solid Quality Learning y yo dos presentaciones en el grupo de usuarios de .net GUSENET.

La agenda es la siguiente:

16:00 - 16:30 Bienvenida y registro
16:30 - 17:45 LINQ to SQL avanzado (Ruben Garrigos)
17:45 - 18:15 Descanso
18:15 - 19:45 Novedades SQL Server 2008 (Enrique Catala)

La ubicación del mismo: Aula 1.01 de la Facultad de Informatica del Campus de Espinardo de la Universidad de Murcia.

Para registraros en el evento, lo podeis hacer a traves del siguiente enlace: http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032375941&Culture=es-ES 

Para mas información, dirigiros a la web del grupo de usuarios: www.gusenet.com donde encontrareis toda la información al respecto.

[DSL] Agregar un menú personalizado en VS2008

La forma en la que se añade un menú personalizado ha variado en la nueva versión de Visual Studio 2008. El SDK de extensibilidad de Visual Studio 2008 ha variado la forma en la que se generan menús y comandos de forma que ya no se utilizan los “antiguos” ficheros de configuración .ctc.

Como pequeña introducción, os digo que en la nueva versión se ha optado por un nuevo sistema de configuración más acorde a los tiempos que corren basado en XML. Dicho sistema de configuración está completa y exquisitamente explicado en el siguiente enlace (no apto para lectura al final del dia;).

Dicho esto, os aviso de antemano que la documentación que viene con la propia descarga del ejecutable SDK Extensibility 1.0 para Visual Studio 2008 es errónea y hace referencia al antiguo sistema de configuración (por lo menos en lo que nos atañe que son los menús en DSL). El antiguo sistema de agregación de menús personalizados en nuestros lenguajes de dominio está explicado bastante bien en el blog de “El Bruno” o en la propia documentación que viene con el descargable de extensibilidad que he mencionado.

Vamos a ponernos manos a la obra. Para ello parto de que tienes ya tu proyecto de lenguaje de especificación de dominio creado…

image

Tal cual está, podemos crear nuestro menú de una forma bastante más sencilla que antes siguiendo los siguientes pasos:

1. En el “Solution Explorer”, desplegar el proyecto DslPackage y editar el archivo Commands.vsct

image

En dicho archivo es donde vamos a tener que añadir los elementos del menú que queremos. En nuestro caso vamos a crearnos un botoncito que nos diga la figura que hemos clickeado.

La forma de crear nodos dentro del archivo está “explicada” muy por encima en los documentos de ayuda de mdsn (por lo menos ahora cuando escribo este post) por lo que seguramente acabarás antes viéndolo desde aquí ;)

Básicamente lo que vamos a hacer es definirnos un botón y una identificación del mismo. Importante a tener en cuenta son los nodos <Commands/> y <Symbols/> (no quiero liaros con el nodo <Extern/> que no vamos a tocar ahora)

2. Dentro del nodo <Commands/> introducir un nodo con la descripción del botón que quereis crear

<Buttons>
<Button guid="cmdDimeNombreFiguraGUID" id="cmdDimeNombreFiguraID type="Button">
<Parent guid="guidCmdSet" id="grpidContextMain"/>
<Strings>
<CanonicalName>cmdDimeNombreFigura</CanonicalName>
<ButtonText>Nombre figura</ButtonText>
<ToolTipText>Dice el nombre de la figura seleccionadaToolTipText>
</Strings>
</Button>
</Buttons>

3. Fuera del nodo <Commands/> y al mismo nivel que él, declaramos el nodo <Symbols/> de la siguiente forma

<Symbols>
<GuidSymbol name="cmdDimeNombreFiguraGUID" value="{D5A40ECA-BA87-4a92-B6A7-A36C27C858AE}">
<IDSymbol name="cmdDimeNombreFiguraID" value="1"/>
</GuidSymbol>
</Symbols>

El valor del GuidSymbol ha sido generado mediante la aplicación guidgen.exe
El valor del IDSymbol puede ser decimal o hexadecimal (por ejemplo, valores 0x104 pueden darse) y podemos darle el que queramos.

4. Estado del fichero Commands.vsct

Una vez realizado esto, el fichero queda de la siguiente manera:

<?xml version="1.0" encoding="utf-8"?>
<CommandTable xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable xmlns:xs="http://www.w3.org/2001/XMLSchema>
<!-- -->
<!-- This file contains custom command definitions. -->
<!-- -->
<!-- NOTE: Each time commands are added or changed, the "version" parameter to the -->
<!-- ProvideMenuResource attribute in Shell\Package.tt should be incremented. -->
<!-- This causes Visual Studio to re-merge the menu definitions for the package. -->
<!-- Otherwise, changes won't take effect until the next time devenv /setup is run. -->
<!-- -->
<Extern href="stdidcmd.h"/>
<Extern href="vsshlids.h"/>
<Extern href="msobtnid.h"/>
<Extern href="virtkeys.h"/>
<Extern href="DSLToolsCmdID.h"/>
<Include href="GeneratedCode\GeneratedVsct.vsct"/>
<Commands package="guidPkg">
<Buttons>
<Button guid="cmdDimeNombreFiguraGUID" id="cmdDimeNombreFiguraID" type="Button">
<Parent guid="guidCmdSet" id="grpidContextMain"/>
<Strings>
<CanonicalName>cmdDimeNombreFigura</CanonicalName>
<ButtonText>Nombre figura</ButtonText>
<ToolTipText>Dice el nombre de la figura seleccionada</ToolTipText>
</Strings>
</Button>
</Buttons>
</Commands>
<Symbols>
<GuidSymbol name="cmdDimeNombreFiguraGUID" value="{D5A40ECA-BA87-4a92-B6A7-A36C27C858AE}">
<IDSymbol name="cmdDimeNombreFiguraID" value="1"/>
</GuidSymbol>
</Symbols>
</CommandTable>

5. Ahora, siguiendo lo que dice en los comentarios del propio fichero a la parte de arriba, le incrementamos el nº de versión al atributo ProvideMenuResource del fichero “GeneratedCode/Package.tt” (notese que en el comentario referencia a Shell/Package.tt ;)

image

Para ello, lo editamos y reemplazamos lo que viene por defecto ( [VSShell::ProvideMenuResource("1000.ctmenu", 1)] ) , por [VSShell::ProvideMenuResource("1000.ctmenu", 2)]

6. Ahora, vamos a asignarle el comportamiento al botón. Para ello hemos de abrir el fichero GeneratedCode/CommandSet.cs

image

Y le añadimos los métodos OnPopUpMenuClick(), OnPopUpMenuDisplayAction() y GetMenuComands() a la clase.

Evidentemente lo que no vamos a hacer es escribir el código directamente sobre el fichero CommandSet.cs puesto que dicho fichero se machaca cuando le damos a “Transform All Templates” por lo que haciendo uso de las posibilidades de definición de clases parciales, le definiremos el código en un nuevo fichero.

7. Creamos la carpeta Customization y luego añadimos una nueva clase, que será la que contenga el código, de forma que nos quedará como la figura siguiente:

image

NOTA: En mi caso, mi lenguaje se llama LenguajeOOMM y por eso la clase generada en CommandSet.cs se llama así. Por seguir una nomenclatura estándar he creado dicho nombre al fichero. En cualquier caso, el contenido siempre ha de ser el de la definición de la clase doblemente derivada.

Antes hacíamos referencia al fichero CommandSet.cs. Por poco que lo abramos y le demos un vistazo veremos que sigue la pauta de clase doblemente derivada (que se sale del tema del post pero que en futuros post trataré) que crea una clase heredada de DslShell::CommandSet (en mi caso llamada LenguajeOOMMCommandSetBase), y luego otra clase que hereda de la anterior y es a la que vamos a añadirle la funcionalidad citada en el paso 6.

8. Introducimos el siguiente código dentro de LenguajeOOMMCommandSet.cs (en tu caso, el fichero .cs que has creado para tal fin)

using System;
using System.Collections.Generic;
using System.ComponentModel.Design;
using Microsoft.VisualStudio.Modeling.Shell;
using System.Collections;
using System.Text;

namespace LenguajeOOMM
{
/// <summary>
/// Double-derived class to allow easier code customization.
/// </summary>
internal partial class LenguajeOOMMCommandSet : LenguajeOOMMCommandSetBase
{
protected override IList<System.ComponentModel.Design.MenuCommand> GetMenuCommands()
{
IList<System.ComponentModel.Design.MenuCommand> commands = base.GetMenuCommands();

DynamicStatusMenuCommand cmdDimeNombreFigura =
new DynamicStatusMenuCommand(
new EventHandler(OnPopUpMenuDisplayAction),
new EventHandler(OnPopUpMenuClick),
new CommandID(new Guid(“D5A40ECA-BA87-4a92-B6A7-A36C27C858AE”), 1));

commands.Add(cmdDimeNombreFigura);

return commands;
}

/// <summary>
/// Lo que se desencadena al pinchar sobre el boton.
/// En principio no queremos nada mas que se muestren los objetos seleccioonados
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
internal void OnPopUpMenuClick(object sender, EventArgs e)
{
MenuCommand command = sender as MenuCommand;

StringBuilder sb = new StringBuilder();
foreach (object selectedObject in this.CurrentSelection)
{
sb.AppendLine("Objetos Seleccionados: " + selectedObject.ToString());
}

System.Windows.Forms.MessageBox.Show(sb.ToString());
}

/// <summary>
/// Se desencadena cuando vamos a mostrar el menú.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
internal void OnPopUpMenuDisplayAction(object sender, EventArgs e)
{
MenuCommand command = sender as MenuCommand;

foreach (object selectedObject in this.CurrentSelection)
{
// Solo se desencadena si entre todos los objetos seleccionados, hay algun ExampleShape
//para conectores por tanto no sale. Comportamiento a posta
if (selectedObject is ExampleShape)
{
command.Visible = true;
command.Enabled = true;
return;
}
}
//por defecto deshabilitado
command.Visible = false;
command.Enabled = false;
}
}
}

9. Una vez llegados a este punto solo nos queda pinchar sobre “Transforma ll templates” y compilar.
Ahora nos saldrá el elemento del menú en cuestión y al clickear nos saldrá un MessageBox con la información que queríamos.

image

image

Ni que decir tiene las posibilidades de esto. Podemos crearnos un menú que interactúe con nuestro propio modelo de forma que podamos cambiar incluso el aspecto o propiedades de nuestros objetos para que sin tener que borrar figuras, las podamos modificar

martes, 25 de marzo de 2008

Diapositivas de SQL Server 2008 Jumpstart

En los meses de Febrero y Marzo llevamos a cabo en la sede de Microsoft Ibérica la presentación de SQL Server 2008 de una forma un poco más técnica. Esta presentación recibió el nombre de SQL Server 2008 Jumpstart y en ella, durante dos días estuvimos enseñando a los asistentes la mayoría de las novedades que se nos vienen encima con SQL Server 2008 tanto a nivel relacional como a nivel de inteligencia de negocio.

Hemos puesto a descarga libre para cualquiera que lo desee, las diapositivas de lo que enseñamos, simplemente descargándolo de aquí:

En las diapositivas, podrás ver que se mencionan demostraciones de las características (no va a ser todo teoría, claro ;). Recuerda que al igual que acabamos de hacer con las diapositivas, hace pocos días también publicamos los vídeos de las demostraciones que acompañaban a las mismas. Simplemente te remito al post donde se liberaron: http://blogs.solidq.com/ES/ElRinconDelDBA/Lists/Posts/Post.aspx?ID=50

Si deseas conocer las novedades relativas a Inteligencia de negocio, pásate por aquí al lado en el blog de nuestro equipo de inteligencia de negocio, donde se publicaran los materiales de BI: http://blogs.solidq.com/ES/BICorner/default.aspx

domingo, 23 de marzo de 2008

Change Data Capture y el modo de recuperación BULK LOGGED

En SQL Server 2008 aparecen entre otras muchas novedades, la posibilidad de realizar monitorización de cambios de datos en tablas (a nivel de columnas si queremos). Esta tecnología se denomina Change Data Capture (sus siglas CDC) y viene a mejorar y facilitar las labores relacionadas con la LOPD, ya que nos permite de una forma cómoda y sencilla realizar un seguimiento de cambios de nuestros datos de forma automática.

Hasta la llegada de SQL Server 2008, solo teníamos la opción de realizar esto de forma manual de la siguiente manera:

  • Crear una tabla con el mismo esquema que la tabla a auditar (mismas columnas y mismos tipos de datos).
  • Crear Triggers para inserción, modificación y borrado sobre la tabla a auditar, que se encargarían de replicar los cambios sobre la tabla LOPD.

Este proceso, aparte de ser obviamente costoso puesto que requería de un proceso de codificación y mantenimiento elevado (alguien lo tenía que acabar programando), tenía un gran impacto en el rendimiento de la BBDD puesto que implicaba que cada modificación de datos desencadenaría un trigger y un INSERT en alguna tabla.

Para solucionar esta problemática aparece entonces CDC en SQL Server 2008 ya que minimiza el impacto en el sistema utilizando la infraestructura del agente de lectura del log de transacciones existente de forma que los cambios auditados aparecen de forma asíncrona en las tablas de auditoría.


El título de este post es referente a una de las preguntas que se nos realizó durante el evento de SQL Server 2008 Jumpstart en Microsoft Ibérica hace unos días. Uno de los asistentes planteó la duda de si esta infraestructura funcionaría cuando estábamos utilizando un modo de recuperación BULK LOGGED. En ese momento no pudimos responder mediante un ejemplo práctico puesto que teníamos un tiempo limitado para realizar las demostraciones, pero algún asistente comentó la posibilidad de que no funcionaria en ese escenario ya que al fin y al cabo lo que se hace es leer del log de transacciones y "en una etapa BULK LOGGED lo que se realiza mediante carga masiva no queda registrado en el log de transacciones".

Por un lado hemos de apuntar que el comportamiento de modificaciones INSERT, UPDATE y DELETE evidentemente funcionara en cualquier tipo de configuración de modo de recuperación (FULL, SIMPLE o BULK LOGGED), puesto que en todos los modos se escribe todo absolutamente en el log de transacciones (otra cosa es que se hace con esos datos escritos). La duda estaba en el modo de recuperación BULK LOGGED ante cargas masivas (BULK INSERT) puesto que en la demo se mostró el funcionamiento de CDC en un entorno configurado con modo de recuperación SIMPLE.

Antes de nada, voy a explicar cómo nos podemos beneficiar del modo de recuperación BULK-LOGGED.

Como alguien comentó, el modo de recuperación BULK-LOGGED no registra en el log de transacciones las modificaciones realizadas mediante una carga masiva…pero esto no es del todo cierto siempre, puesto que solo ocurre en determinadas condiciones.

Las condiciones que han de cumplirse para logging mínimo son:

  • La base de datos ha de estar obviamente con modo de recuperación BULK-LOGGED
  • La tabla que va a sufrir la actualización masiva no ha de estar replicada
  • Se utiliza TABLOCK (bloqueo de tabla) en la actualización masiva
  • La tabla destino ha de cumplir con los requisitos de datos e indexación de la tabla siguiente:

    Clustered Index

    Nonclustered Index

    Si

    No

    Si

    No

    TABLA

    Vacía

    Minimo

    Minimo

    Minimo

    Minimo

    Con Datos

    Completo

    Minimo

    Index

    Minimo


Dicho esto, os comento ahora que internamente CDC utiliza un "log reader agent" , al igual que sucede en replicación transaccional. Dicho de otro modo…que aunque en los Books Online no diga nada al respecto porque todavía no están completos (cuando escribo esto estamos en CTP6 todavía), seguro que aparece un punto más, diciendo que la tabla que va a sufrir la modificación masiva, no puede estar siendo auditada mediante CDC para poder tener logging mínimo ante modificaciones masivas ;)

Dicho esto, me monté el entorno de pruebas pertinente y comprobé si es cierto según lo que acabo de comentar, que CDC sí que funciona ante cargas masivas aún cuando estamos en modo de recuperación BULK-LOGGED. No es el momento de que os exponga aquí los scripts con los que lo he probado, porque en un futuro post ya se subirán los scripts del Jumpstart donde aparecerá entre otros el de CDC; pero como a veces una imagen vale más que mil palabras, aquí tenéis el screenshot que demuestra que CDC funciona con una operación bulk insert sobre una tabla auditada y una base de datos en modo de recuperación BULK LOGGED.


Lo que veis en el screenshot son los cambios en los datos ocurridos en la tabla dbo.Employee desde el principio de los tiempos (solo le hice unas pocas modificaciones ;). Lo que veis marcado en rojo con operación = 2 (INSERT) con los números LSN acabados en 7A002, 7A003 y 7A004 es el resultado de una carga masiva de 3 filas en la tabla, precisamente con los datos que veis (employeeid, lastname y firstname)

Evidentemente, que funcione CDC ante una carga masiva teniendo el modo de recuperación Bulk-logged quiere decir que no estamos ahorrándonos escrituras en el log de transacciones, por lo que tendrás que tenerlo en cuenta si sigues una política de cambios a bulk-logged para mejorar el rendimiento de algunas cargas masivas cuando las realices sobre tablas auditadas mediante CDC.

También comento que hice la misma prueba con una importación de un millón de registros pero los resultados no los pongo aquí puesto que aparece una pequeña incongruencia propia de la versión beta que es, que se sale del ámbito del post…pero probado está ;).

lunes, 25 de febrero de 2008

Windows Vista SP1

Una de las muchas mejoras que nos vienen con Windows Vista SP1 es la del soporte de 64-bits para el proveedor OLEDB de Microsoft (MSDASQL). Este, actuará como puente para una gran variedad de drivers ODBC que no funcionaban bajo arquitecturas de 64-bits.

Gracias a ello, se simplifica la migración de aplicaciones sobre plataformas de 32-bits a plataformas de 64-bits.

Podeis leer mas acerca de las mejoras incluidas en Windows Vista SP1 en el siguiente enlace.

Por cierto, se ha habilitado la descarga de la versión RTM de Windows Vista SP1 a los subscriptores MSDN (link)

lunes, 21 de enero de 2008

Doblando mi residencia ;)

Debido a mi reciente incorporación a Solid Quality Mentors , los futuros posts los realizaré tambien sobre el blog que tenemos el resto de compañeros y yo.

Podeis acceder a traves de la siguiente dirección: http://blogs.solidq.com/ES/ElRinconDelDBA/default.aspx

Un saludo y nos vemos en el otro lado (también)

miércoles, 2 de enero de 2008

Visibilidad de paquetes DTS en SQL Server 2005

Para aquellos que habeis realizado una migración a SQL Server 2005 y teníais Servicios de Transformación de Datos ( DTS ) en SQL Server 2000, Microsoft ha publicado un paquete de compatibilidad para DTS. Dicho pluggin nos permite entre otras cosas poder editar y mantener nuevos DTS desde SQL Server 2005.


Algo que nos puede ocurrir es que queramos que alguno de nuestros compañeros pueda tener acceso a dichos DTS para poder editarlos por ejemplo. Por defecto no tendremos permiso a listar los paquetes y por lo tanto tampoco podremos editarlos. Lo que hay que hacer es asignarle el permiso SELECT al objeto sysdtspackages dentro de la base de datos MSDB.


USE msdb;

GRANT
SELECT
ON
OBJECT::sysdtspackages
TO [usuario];

--REVOKE
SELECT
ON
OBJECT::dbo.sysdtspackages
TO [usuario];


Una gran pega es que este paquete no es compatible con la version de 64-bits por lo que si nuestro servidor de SQL Server utiliza Windows de 64-bits y SQL Server de 64-bits olvidate de esto :(

Para la descarga, visitar este enlace y descargar e instalar SQLServer2005_DTS.msi