viernes, 29 de mayo de 2009

Atraco a mano armada

Cuando pensé en crear un blog, fue con la ídea de compartir mis conocimientos con otros desarrolladores de software y administradores de sistemas que tuvieran algunas inquitudes sobre nuevas herramientas que estuvieran en el mercado, métodos para realizar algunas tareas, entre otras cosas orientada a esta parte de la informática.
Pero hoy 29 de mayo del 2009 voy a tocar otro tema, la falta de seguridad existente en la República Dominicana.
En los últimos días mi novia y yo hemos estado realizando caminatas alrededor de uno de los principales pulmones de la ciudad de Santo Domingo, el jardín botánico, para mejorar la figura y ayudar a nuestro organismo a estar más saludable.
El viernes 29 de mayo mientras realizabamos nuestra acostumbrada caminata alrededor del lugar, fuimos atracados por dos jovenes almados y me despojaron de un artículo muy preciado para mí, así como el efecto sicológico que eso nos causó. Gracias a Dios, un persona nos socorrió y no pasó a males mayores.
Realmente, no se hasta que punto va a seguir esta situación en el país, pero los ciudadanos decentes que habitamos en el país nos estamos cansando de esto, de las injusticias, la falta de control, la poca seguridad que ofrece nuestro gobierno, el clientelismo políticos y todos los males que afectan nuestro bello país. Al ocurrirno esto, solo nos pasó por la mente, alejarnos de la tierra que tantos amamos, y es una idea que estamos ponderando seriamente, ya que, sería difícil ver un hijo nacer en tierra de nadie (o de falsos políticos y militares) donde lo que menos importa es la vida del ciudadano.
De corazón, espero que esto mejore, pero mientras cosas así sigan pasando, más personas talentosas van a sopesar salir del país.

Nuevos aires Laborales.

El 27 de mayo de 2009 fue mi último día de labor en la empresa MediaExpress donde estuve desempeñando la posición de desarrollador senior por alrededor de dos años y encargado del departamento de tecnología por 1 año y un mes. En esa empresa tuve la oportunidad de aprender muchas cosas nuevas, y poder ejecutar algunas de las cosas que había aprendido en otros lugares.

Sobre conocimiento, les puedo decir, que hasta hace 2 años no tenía el más mínimo conocimiento sobre monitoreo de audio y video (MediaExpress se dedica a monitorear publicidad y relaciones públicas en medios electrónicos y digitales) y hoy en día soy un vasto conocedor del área. En esa empresa pude aplicar mis conocimientos en administración de base de datos, así como active directory y desarrollo web.

Quiero agradecer a todas aquellas personas que influyeron en que realizara una buena labor en la empresa, especialmente a los jovenes desarrolladores Fidel Florián y Alexander Matos por la ayuda brindada en ese úlitmo año en el que me desempeñé en la empresa.

Ahora inicio un nuevo período en una empresa de desarrollo, donde espero lograr las metas que me he propuesto para un período de corto plazo.

martes, 19 de mayo de 2009

Generar Diccionario de Datos Sql Server 2000

A veces tenemos necesidades urgente con un tiempo muy corto (o como dicen en mi país, con el tiempo arriba) donde necesitamos entregar un proyecto o una determinada posición y no tenemos la documentación de las aplicaciones o los diccionarios de datos de la base de datos que necesitamos.

Hace dos días se me presentó esa dificultad, tenía mis aplicaciones documentadas, toda la documentación de las políticas que maneja el departamento, los diagramas de flujos de la aplicaciones, los diagramas de base de datos, pero me faltaba algo y no sabía que era.

Cuando me quedaba solo 1 día para entregar la posición recordé que no había documentado las base de datos, y estas eran enormes, y me estaban esperando con urgencia en mi nuevo trabajo. Tuve que tomar la decisión de generar un HTML a partir de la misma base de datos con algo parecido a un diccionario de datos y les voy a mostrar el código utilizado para el mismo, espero les sirva.

declare @databases varchar(150)

set @databases = 'db_practica'

use db_practica
/*
Cursor: generate XML data information from SQL Server 2000.
Created By: Michael Núñez
Created On: 2009-05-15
Modified ON: 2009-05-19
Version: v1.3
*/

set nocount on

declare
@srvname sysname

/* Declares for databases variables */
declare @db_name sysname
declare @dbid smallint
declare @db_filename nvarchar(520)
declare @db_crdate datetime

/* Declares for databases files variables */
declare @f_name nchar(256)
declare @f_filename nchar(520)
declare @f_size int
declare @f_groupname sysname

/* Declares for tables variables */
declare @id int
declare @table_name sysname

declare @xtype char(2)
declare @crdate datetime
declare @refdate datetime


/* Declares for columns variables */
declare @column_name sysname
declare @column_type sysname
declare @cdefault int
declare @prec smallint
declare @scale int
declare @isnullable int
declare @pk char
(2)

select @db_name = name, @dbid = dbid, @db_filename = filename, @db_crdate = crdate
from master..sysdatabases where dbid = db_id(@databases)

select top 1 @srvname = srvname from master..sysservers

print '<html>'
print '<head><title>'
print 'Data Dictionary'
print '</title>'
print '<style type="text/css">'
print '<!--'
print '.style5 {color: #CCCCCC; font-weight: bold; }'
print '.style6 {color: #0000CC}'
print '.style7 {color: #000066}'
print '-->'
print '</style>'
print '</head>'
print '<body>'
print '<div>'


print '<div>'
print '<h1><span class="style7">Databases Name: </span>'
+ @db_name + '</h1>'
print '<hr noshade/>'
print '<strong><span class="style7">Filename: </span>' + @db_filename + '</strong>'
print '<br />'

print '<strong><span class="style7">Created Date: </span>' + convert(varchar,@db_crdate) + '</strong>'

print '<br />'
print '<strong><span class="style7">Server Name: </span>' + (@srvname) + '</strong>'
print '<hr />'

declare files_cursor cursor for

select name, filename, size, isnull((select groupname from sysfilegroups b where b.groupid = a.groupid),'N/A')
from sysfiles a

open files_cursor

fetch next from files_cursor
into @f_name, @f_filename, @f_size, @f_groupname

print '<ul>'

while @@fetch_status = 0
begin

print '<li><b>' + @f_name + '</b&gt;<br /> - File: ' + @f_filename + '<br /> - Size: ' + convert(varchar,@f_size) + '<br /> - Filegroup: ' + @f_groupname + '</li>'

fetch next from files_cursor
into @f_name, @f_filename, @f_size, @f_groupname

end
print
'</ul>'

close files_cursor
deallocate files_cursor

declare table_cursor cursor for
select
id, name,
xtype, crdate, refdate from sysobjects where xtype = 'u'

open table_cursor

fetch next from table_cursor
into @id, @table_name, @xtype, @crdate, @refdate

while @@fetch_status = 0
begin

print ' <h2> Table Name: ' + @table_name + '</h2>'
print ' <h4 class="style6">Created Date: ' + convert(varchar,@crdate) + '</h4>'
print ' <table border="1" cellpadding="2" cellspacing="0" bordercolor="#CCCCCC">'
print ' <tr bordercolor="#0066CC" bgcolor="#0066CC">'
print ' <th><span class="style5"> </strong></th>'
print ' <th><span class="style5">Column Name</strong></th>'
print ' <th><span class="style5">Column Type</strong></th>'
print ' <th><span class="style5">Default Value</strong></th>'
print ' <th><span class="style5">Pre</strong></th>'
print ' <th><span class="style5">Scale</strong></th>'
print ' <th><span class="style5">Nullable</strong></th>'
print ' </tr>'


declare columns_cursor cursor for
select name, type = (select top 1 name from systypes b where b.type = a.type and b.xtype = a.xtype),
cdefault, isnull(prec,0) as prec, isnull(scale,0) as scale, isnullable,
pk = isnull((select top 1 'PK' from sysobjects where xtype = 'u' and parent_obj = id),' ')
from syscolumns a where id = @id

open columns_cursor

fetch next from columns_cursor
into @column_name, @column_type, @cdefault, @prec, @scale, @isnullable, @pk

while @@fetch_status = 0
begin

print ' <tr>'
print ' <td>' + @pk + '</td>'
print ' <td>' + @column_name + '</td>'
print ' <td>' + isnull(@column_type,'varchar') + '</td>'
print ' <td>' + convert(varchar,@cdefault) + '</td>'
print ' <td>' + convert(varchar,@prec) + '</td>'
print ' <td>' + convert(varchar,@scale) + '</td>'
print ' <td>' + convert(varchar,@isnullable) + '</td>'
print ' </tr>'

fetch next from columns_cursor
into @column_name, @column_type, @cdefault, @prec, @scale, @isnullable, @pk

end

print ' </table>'

close columns_cursor
deallocate columns_cursor

fetch next from table_cursor
into @id, @table_name, @xtype, @crdate, @refdate

end

close table_cursor
deallocate table_cursor

print '</div>'

print '</div>'
print '</body>'
print '</html>'

Para poder copiar este código en Blogger tuve que utilizar la herramienta http://www.simplebits.com/cgi-bin/simplecode.pl?mode=process ya que no podía pegarla directamente y convertir "<" en "<" es una tarea dificil en un post tan largo.

Realmente espero que les sirva y si pueden hacerla para varias base de datos favor escribirme a elymichael@gmail.com, en caso de que yo no termine primero, :) .

Nota: El lector Adán Salvador Aguilera Campos de México, hizo unas mejoras significativas a este script, pueden visualizarlo en el siguiente enlace.

viernes, 15 de mayo de 2009

Crear un Cursor SQL Server

Saludos, En esta ocación voy a mostrarle como crear un cursor en SQL Server y explicar la importancia del mismo.

Un cursor es una herramienta de SQL Server que nos permite recorrer el resultado de una consulta SQL y realizar operaciones con estos resultados dentro de un bucle de datos.

Para mostrar la sintaxis del cursor utilizemos el siguiente planteamiento, tenemos una tabla denominada persona y deseamos imprimir en pantalla los nombres y apellidos de todos los registros almacenados en la table persona.

La sintaxis de declaración de un cursor es la siguiente:

declare cursor_prueba cursor for
select nombres, apellidos from persona

/*ahora declaramos las variables con las que vamos a recorrer el cursor:*/

declare @nombres varchar(25)
declare @apellidos varchar(25)

/*Abrimos el cursor para iniciar el recorrido del mismo*/
open cursor_prueba

/*Se mueve al siguiente registro dentro del cursor y los asignamos a las variables antes declaradas*/
fetch next from cursor_prueba
into @nombres, apellidos

/*Retorna el estatus del último registro recorrido en el cursor, cuando es igual a 0 encontró registro pendientes de recorrer*/
while @@fetch_status = 0
begin

print 'El Nombre de la persona es: ' + @nombres + ' y sus apellidos: ' + apellidos

/*Se mueve al siguiente registro dentro del cursor*/
fetch next from cursor_prueba
into @nombres, apellidos


end

/* Cuando concluimos con el recorrido del cursor, este debe ser cerrado y luego destruído mediante las siguientes sentencias:*/
close cursor_prueba --Cierra el cursor.
deallocate cursor_prueba --Lo libera de la memoria y lo destruye.

Los cursores son muy eficientes para utilizarlos en Job de las base de datos que realizen alguna operación donde necesitemos modificar alguna información dentro de un bucle. Los cursores demandan mucho del servidor de base datos, por lo tanto, no es recomendable abusar del mismo, ya que necesitan bastante recursos para su ejecución