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í: