none
Validación de nodo para JOBS RRS feed

  • Pregunta

  • Buenas,

      Gente, quiero hacer un paso que me valide en los JOBs, para un SQL mirror, si las bases de datos están con el Rol de primario y si no lo están entonces que los JOBs no se ejecuten.

    Estaba viendo que el dato lo puedo sacar de la vista sys.database_mirroring, el asunto es que no se si hacer un stored procedure que me devuelva un Falso.

    Agradezco alguna ayuda.


    Jose Miguel Salas C

    martes, 21 de noviembre de 2017 21:49

Respuestas

  • Hola,

      Me puse a revisar y lo hice de la siguiente forma:

    1. Ejecutas este codigo para crear un SP:

    USE master
    go
    
    
    CREATE PROCEDURE dbo.Valida_nodo (@Role VARCHAR(30) = 'PRINCIPAL'  ,@BasesDatos VARCHAR(4000) = NULL)
    AS
    
    BEGIN
    
    	--- Variables
    	DECLARE @ListadoBDs TABLE (Id INT NOT NULL IDENTITY(1,1)
    								, NombreBD VARCHAR(128) NULL)
    
    	DECLARE @ListadoBDsValidadas TABLE (NombreBD VARCHAR(128) NOT NULL,
    								  MirrorState VARCHAR(30) NULL,
    								  MirrorRole VARCHAR(30) NULL)
    
    	--- Si viene listado separados por comas, convertir en tabla							  
    	IF @BasesDatos IS NOT NULL
    	BEGIN
    		DECLARE @x XML 
    
    		SELECT @x = CAST('<A>'+ REPLACE(@BasesDatos,',','</A><A>')+ '</A>' AS XML)
    
    		INSERT INTO @ListadoBDs (NombreBD)           
    		SELECT t.value('.', 'VARCHAR(128)') AS inVal
    		FROM @x.nodes('/A') AS x(t)
    	END
    
    	-- Obtener bases de datos que no cumplen
    	INSERT INTO @ListadoBDsValidadas (NombreBD,MirrorState,MirrorRole)
    	SELECT b.name, a.mirroring_state_desc, a.mirroring_role_desc
    	FROM   sys.database_mirroring AS a
    		INNER JOIN sys.databases AS b
    	ON a.database_id = b.database_id
    	WHERE  b.name NOT IN ('master','tempdb','model','msdb')
    		   AND a.mirroring_role IN (1,2)
    		   AND (@Role IS NULL OR a.mirroring_role_desc != @ROLE )
    		   AND (@BasesDatos IS NULL OR b.name IN (SELECT LD.NombreBD FROM @ListadoBDs LD))
    
    	-- Si hay registros, entonces hay bases de datos en otros roles al definido
    	IF EXISTS (SELECT 1 FROM @ListadoBDsValidadas)
    	BEGIN
    			DECLARE @Msg VARCHAR(8000)
    
    			SET @Msg = (SELECT 
    						  STUFF((SELECT ',' + LV.NombreBD
    								 FROM @ListadoBDsValidadas LV
    									FOR XML PATH(''), TYPE
    									).value('.', 'NVARCHAR(MAX)')
    																,1,1,'') Bds)
    			RAISERROR('Las bases de datos "%s" no cumplen con ROLE="%s"',16,1,@Msg,@Role)
    
    	END
    	ELSE
    	BEGIN 
    		PRINT 'Todas las bases de datos cumplen con el rol indicado'
    	END
    END
    GO 
    

    2- Creas el JOB y le agregas como primer paso un T-SQL haciendo el llamado al SP creado de la siguiente forma: EXEC Valida_Nodo 'PRINCIPAL'

    3- Configuras el paso, para que si falle, termine el JOB y reporte SUCCES.

    Espero que les sea de utilidad.


    Jose Miguel Salas C

    • Marcado como respuesta JoseSalas miércoles, 22 de noviembre de 2017 17:04
    miércoles, 22 de noviembre de 2017 17:04

Todas las respuestas

  • Hola JoseSalas

    Con base a tu consulta, te recomiendo ir al siguiente enlace que puede ser de gran utilidad.

    Quedamos al pendiente de cualquier actualización de tu parte

    Saludos Cordiales.

    Gracias por usar los foros de MSDN.

    Pablo Rubio
    _____
     
    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
     
    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.
     
    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    • Propuesto como respuesta Jorge TurradoMVP miércoles, 22 de noviembre de 2017 16:51
    miércoles, 22 de noviembre de 2017 16:47
    Moderador
  • Hola,

      Me puse a revisar y lo hice de la siguiente forma:

    1. Ejecutas este codigo para crear un SP:

    USE master
    go
    
    
    CREATE PROCEDURE dbo.Valida_nodo (@Role VARCHAR(30) = 'PRINCIPAL'  ,@BasesDatos VARCHAR(4000) = NULL)
    AS
    
    BEGIN
    
    	--- Variables
    	DECLARE @ListadoBDs TABLE (Id INT NOT NULL IDENTITY(1,1)
    								, NombreBD VARCHAR(128) NULL)
    
    	DECLARE @ListadoBDsValidadas TABLE (NombreBD VARCHAR(128) NOT NULL,
    								  MirrorState VARCHAR(30) NULL,
    								  MirrorRole VARCHAR(30) NULL)
    
    	--- Si viene listado separados por comas, convertir en tabla							  
    	IF @BasesDatos IS NOT NULL
    	BEGIN
    		DECLARE @x XML 
    
    		SELECT @x = CAST('<A>'+ REPLACE(@BasesDatos,',','</A><A>')+ '</A>' AS XML)
    
    		INSERT INTO @ListadoBDs (NombreBD)           
    		SELECT t.value('.', 'VARCHAR(128)') AS inVal
    		FROM @x.nodes('/A') AS x(t)
    	END
    
    	-- Obtener bases de datos que no cumplen
    	INSERT INTO @ListadoBDsValidadas (NombreBD,MirrorState,MirrorRole)
    	SELECT b.name, a.mirroring_state_desc, a.mirroring_role_desc
    	FROM   sys.database_mirroring AS a
    		INNER JOIN sys.databases AS b
    	ON a.database_id = b.database_id
    	WHERE  b.name NOT IN ('master','tempdb','model','msdb')
    		   AND a.mirroring_role IN (1,2)
    		   AND (@Role IS NULL OR a.mirroring_role_desc != @ROLE )
    		   AND (@BasesDatos IS NULL OR b.name IN (SELECT LD.NombreBD FROM @ListadoBDs LD))
    
    	-- Si hay registros, entonces hay bases de datos en otros roles al definido
    	IF EXISTS (SELECT 1 FROM @ListadoBDsValidadas)
    	BEGIN
    			DECLARE @Msg VARCHAR(8000)
    
    			SET @Msg = (SELECT 
    						  STUFF((SELECT ',' + LV.NombreBD
    								 FROM @ListadoBDsValidadas LV
    									FOR XML PATH(''), TYPE
    									).value('.', 'NVARCHAR(MAX)')
    																,1,1,'') Bds)
    			RAISERROR('Las bases de datos "%s" no cumplen con ROLE="%s"',16,1,@Msg,@Role)
    
    	END
    	ELSE
    	BEGIN 
    		PRINT 'Todas las bases de datos cumplen con el rol indicado'
    	END
    END
    GO 
    

    2- Creas el JOB y le agregas como primer paso un T-SQL haciendo el llamado al SP creado de la siguiente forma: EXEC Valida_Nodo 'PRINCIPAL'

    3- Configuras el paso, para que si falle, termine el JOB y reporte SUCCES.

    Espero que les sea de utilidad.


    Jose Miguel Salas C

    • Marcado como respuesta JoseSalas miércoles, 22 de noviembre de 2017 17:04
    miércoles, 22 de noviembre de 2017 17:04