lunes, 9 de abril de 2012

Reporte para ventanas de mantenimiento periódicas (semanales, mensuales, etc.)

En mi organización tengo colecciones con ventanas de mantenimiento mensuales. Las uso para tirar actualizaciones a todos los servidores pero de manera organizada, haciendo el deploy de los updates a distintos servidores según su criticidad, o en el caso de los clusters o NLB, asegurándome que no se reinicien todos los nodos al mismo tiempo.
Una pregunta común de compañeros, e incluso de mi mismo, es ¿y cuándo le tocan actualizaciones a X servidor? o ¿cuándo fue la última vez que se le instalaron actualizaciones a X servidor?

Para poder responder esa pregunta rápidamente me he armado un reporte que, tras pedirnos el nombre del equipo en cuestión, nos informa la última y la próxima ventana de mantenimiento que le corresponde.

Seguramente se puede hacer mejor, pero a mí me funciona así:

La query del reporte es esta:

Declare @Primero as datetime
Declare @Segundo as datetime
Declare @Tercero as datetime
Declare @Cuarto as datetime

Declare @ultPrimero as datetime
Declare @ultSegundo as datetime
Declare @ultTercero as datetime
Declare @ultCuarto as datetime

set @Primero=dateadd(dd,-1,DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,7-datepart(day,getdate()),getdate())), 0))
set @Primero=(
case
 when @Primero<getdate() then
  dateadd(dd,-1,DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,7-datepart(day,dateadd(mm,+1,getdate())),dateadd(mm,+1,getdate()))), 0))
 else @Primero
end)

set @Segundo=dateadd(dd,-1,DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,7-datepart(day,getdate()),getdate())), 0))+7
set @Segundo=(
case
 when @Segundo<getdate() then
  dateadd(dd,-1,DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,7-datepart(day,dateadd(mm,+1,getdate())),dateadd(mm,+1,getdate()))), 0))+7
 else @Segundo
end)

set @Tercero=dateadd(dd,-1,DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,7-datepart(day,getdate()),getdate())), 0))+14
set @Tercero=(
case
 when @Tercero<getdate() then
 dateadd(dd,-1,DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,7-datepart(day,dateadd(mm,+1,getdate())),dateadd(mm,+1,getdate()))), 0))+14
 else @Tercero
end)

set @Cuarto=dateadd(dd,-1,DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,7-datepart(day,getdate()),getdate())), 0))+21
set @Cuarto=(
case
 when @Cuarto<getdate() then 
 dateadd(dd,-1,DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,7-datepart(day,dateadd(mm,+1,getdate())),dateadd(mm,+1,getdate()))), 0))+21
 else @Cuarto
end)

set @ultPrimero=dateadd(dd,-1,DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,7-datepart(day,getdate()),getdate())), 0))
set @ultPrimero=(
case
 when @ultPrimero>getdate() then
 dateadd(dd,-1,DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,7-datepart(day,dateadd(mm,-1,getdate())),dateadd(mm,-1,getdate()))), 0))
 else @ultPrimero
end)

set @ultSegundo=dateadd(dd,-1,DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,7-datepart(day,getdate()),getdate())), 0))+7
set @ultSegundo=(
case
 when @ultSegundo>getdate() then
 dateadd(dd,-1,DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,7-datepart(day,dateadd(mm,-1,getdate())),dateadd(mm,-1,getdate()))), 0))+7
 else @ultSegundo
end)

set @ultTercero=dateadd(dd,-1,DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,7-datepart(day,getdate()),getdate())), 0))+14
set @ultTercero=(
case
 when @ultTercero>getdate() then
 dateadd(dd,-1,DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,7-datepart(day,dateadd(mm,-1,getdate())),dateadd(mm,-1,getdate()))), 0))+14
 else @ultTercero
end)

set @ultCuarto=dateadd(dd,-1,DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,7-datepart(day,getdate()),getdate())), 0))+21
set @ultCuarto=(
case
 when @ultCuarto>getdate() then
 dateadd(dd,-1,DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,7-datepart(day,dateadd(mm,-1,getdate())),dateadd(mm,-1,getdate()))), 0))+21
 else @ultCuarto
end)

SELECT dbo.v_R_System.Name0,
v_Collection.Name as 'Colección',
sw.Name AS [Ventana], 
 sw.Description,
  sw.Duration AS 'Duración en minutos',
  sw.IsEnabled AS 'Habilitada',
CASE substring(Description, 12,5)
         WHEN 'First' THEN @Primero
 WHEN 'Secon' THEN @Segundo
         WHEN 'Third' THEN @Tercero
         WHEN 'Fourt' THEN @Cuarto         
      END as [Próxima ejecución],
CASE substring(Description, 12,5)
         WHEN 'First' THEN @ultPrimero
 WHEN 'Secon' THEN @ultSegundo
         WHEN 'Third' THEN @ultTercero
         WHEN 'Fourt' THEN @ultCuarto         
      END as [Última ejecución] 
FROM         
 dbo.v_ServiceWindow AS sw INNER JOIN
    dbo.v_FullCollectionMembership AS fcm ON 
 sw.CollectionID = fcm.CollectionID INNER JOIN 
 v_Collection ON sw.CollectionID=v_Collection.CollectionID INNER JOIN
 dbo.v_R_System ON fcm.ResourceID = dbo.v_R_System.ResourceID 
WHERE (dbo.v_R_System.Operating_System_Name_and0 LIKE '%server%')
 and dbo.v_R_System.Name0=@servidor


La query para el prompt "@servidor" es:
begin
 if (@__filterwildcard = '')
  SELECT DISTINCT SYS.Netbios_Name0 from v_R_System SYS where SYS.Client0=1 and isnull(SYS.Obsolete0, 0) = 0 ORDER By SYS.Netbios_Name0
else
  SELECT DISTINCT SYS.Netbios_Name0 from v_R_System SYS
WHERE SYS.Netbios_Name0 like @__filterwildcard
  and SYS.Client0=1 and isnull(SYS.Obsolete0, 0) = 0
  ORDER By SYS.Netbios_Name0
end


El resultado del reporte se ve así:

No hay comentarios:

Publicar un comentario