martes, 21 de enero de 2014

Tener el código fuente de nuestros programas con un gestor de código es para cualquier programador esencial y practico.El problema esta cuando queremos lo mismo en nuestro servidor de SQL Server.
Ya existen soluciones como Team Fundation de visual Studio o aplicaciones de empresas que suelen costar entre 300€ y 800 € por licencia lo cual no esta disponible a todo el mundo.
He navegado y buscado una solución fácil y gratuita, pero no he encontrado nunca nada.
Es por ello que he creado mi propio gestor fácil, sencillo y por supuesto gratis.
Para ello lo primero que tenemos que  hacer es ejecutar el siguiente código

SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id =
    OBJECT_ID(N'[dbo].[VERSION_CONTROL]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[VERSION_CONTROL](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [Basedatos] [varchar](256) NULL,
    [Tipo] [varchar](50) NULL,
    [ObjetoNombre] [varchar](256) NULL,
    [ObjetoTipo] [varchar](25) NULL,
    [SqlConsulta] [nvarchar](max) NULL,
    [Login] [varchar](256) NULL,
    [Hostname] [varchar](256) NULL,
    [FechaModificacion] [datetime] NULL,
    [Version] [int] NOT NULL,
 CONSTRAINT [PK_VERSION_CONTROL] PRIMARY KEY CLUSTERED
(
    [ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END

GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [TRG_VERSION_CONTROL]
ON DATABASE
FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE,
CREATE_TABLE, ALTER_TABLE, DROP_TABLE,
CREATE_FUNCTION, ALTER_FUNCTION, DROP_FUNCTION,
CREATE_TRIGGER, ALTER_TRIGGER, DROP_TRIGGER,
CREATE_VIEW, ALTER_VIEW, DROP_VIEW,
CREATE_INDEX, ALTER_INDEX, DROP_INDEX

AS

SET NOCOUNT ON

DECLARE @CurrentVersion int
DECLARE @CurrentID int
DECLARE @Basedatos varchar(256)
DECLARE @ObjetoNombre varchar(256)
DECLARE @data XML

SET @data = EVENTDATA()

INSERT INTO dbo.VERSION_CONTROL
    (Basedatos, Tipo,ObjetoNombre, ObjetoTipo, SqlConsulta,
    Login,Hostname,FechaModificacion, Version)
VALUES(
@data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'varchar(256)'),
@data.value('(/EVENT_INSTANCE/EventType)[1]', 'varchar(50)'),  -- value is case-sensitive
@data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)'),
@data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(25)'),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'varchar(max)'),
@data.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(256)'),
HOST_NAME(),
GETDATE(),
0
)

SET @CurrentID = IDENT_CURRENT('VERSION_CONTROL')
SELECT @Basedatos = Basedatos, @ObjetoNombre = ObjetoNombre
    FROM VERSION_CONTROL WHERE ID = @CurrentID
IF (@Basedatos IS NOT NULL AND @ObjetoNombre IS NOT NULL)
BEGIN
    SELECT @CurrentVersion = MAX(Version)
    FROM VERSION_CONTROL WHERE Basedatos = @Basedatos
    AND ObjetoNombre = @ObjetoNombre
    UPDATE VERSION_CONTROL SET Version =
    ISNULL(@CurrentVersion, 0) + 1 WHERE ID = @CurrentID
END
GO
ENABLE TRIGGER [TRG_VERSION_CONTROL] ON DATABASE

En este enlace lo puedes descargar.

En este código lo que haremos es crear una tabla llamada Version_Control dentro de la Base Datos que lo ejecutamos y un trigger en cual guardara cualquier cambio que realicemos sobre procedimientos,tablas,vistas, funciones escalares,funciones tabla y trigger.
Cada vez que ejecutemos un cambio, borrado o creación de cualquiera de los objetos, se lanzará el trigger que nos guardara en la tabla los cambios realizados.
Los datos que guardaremos son la base datos afectada, que tipo de operación (ALTER,CREATE...),nombre del objeto afectado,objeto tipo(Procedimiento, función, trigger...),la consulta sql que hemos lanzado, el usuario de la BD que lo lanza, nombre del host,la fecha en la que se lanzo y versión (si se lanza sobre el mismo objeto, este ira aumentando a 1)

De esta manera siempre sabremos que cambios hemos realizado sobre (por ejemplo) los procedimientos que tengamos en SQL Server y que con el tiempo van modificando y guardados en un tabla, evitando configuraciones engorrosas, sistemas complejos o soluciones caras.
Personalmente, me he quitado mucho trabajo, ya que antes tenia que guardar la modificación en un script, añadirlo al Source Safe. Total por lo menos 15 minutos entre encontrar el archivo, desprotegerlo, editarlo, guardarlo y volverlo a proteger, y con el problema añadido que no te equivoques al editar.Ahora el tiempo que tardo es lo que tarda la consulta en ejecutarse (segundos) y me olvido de nada más.

Ademas de esta solución para no estar lanzando consultas y teniendo que escribir mas, he realizado una aplicación en C# a modo del Source Safe, que te permite ver los cambios que se han realizado y comparar visualmente las 2 versiones mostrando los cambios en colores.

Nota: Se han corregido y añadido alguna funcionalidad más, al final del articulo podrás ver los nuevos cambios realizados

Para descargarlo pulsa Aquí

Solo tenemos que pulsar nueva conexión para conectar al servidor, después mostrara un árbol con todos los objeto excepto las tablas que en esta versión no lo he añadido.
Simplemente al pulsar sobre cualquier objeto como un procedimiento, nos mostrara un grid con las distintas versiones, si no se ha modificado el objeto, solo nos saldrá una linea, si por el contrario has modificado mostrará las distintas versiones.


Si existen varias versiones podemos pulsar el botón de historial y mostrara las distintas versiones.Seleccionando varias (2 a la vez solo) y pulsando el botón de comparar


Nos aparecerá la siguiente pantalla


Donde las lineas azules son lineas modificadas, las verdes lineas añadidas y las rojas son las lineas eliminadas.
El botón de sqlManagement, sirve para abrirlo directamente en la conexión actual, con el objeto seleccionado con el código SQL, en el caso de no haber seleccionado ninguno se abrirá sin nada.
Este programa necesita el FrameWork 4.5 ya que esta compilado con Visual Studio 2010.

Espero que os sea de ayuda, y si veis algún fallo, solo tenéis que indicarmelo para arreglarlo

Fix 1.0
- He arreglado un bug (un despiste ....) que hacia que cuando selecciona por primera vez un nodo del árbol, te mostraba el código SQL de la primera version y no de la ultima.
- He añadido un botón para que puedas guardar el texto SQL que tengas actualmente pulsado
- Ahora guarda la ultima conexión correcta que realizaste para no tener que volver a escribirla en caso de que quieras conectarte a la misma de nuevo.




5 comentarios:

  1. Muy interesante y se ve bastante práctico, voy a probarlo y ya te cuento! :)

    ResponderEliminar
    Respuestas
    1. Espero que te sirva, y si se te ocurre algo para añadir o ves algún error, no dudes en decírmelo para arreglarlo.
      Muchas gracias por probarlo.....

      Eliminar
  2. Una idea genial y gratuita, muchas gracias por el aporte.....
    Eres un maquina

    ResponderEliminar

Site search