Descomponer octetos de una IP en T-SQL

11/08/2006 - 17:12 por pablo.lapido | Informe spam
Comparto con ustedes esta lógica que sirve para descomponer un campo
que contenga una IP válida en todos sus octetos. Esto esta hecho
utilizando únicamente SQL transaccional.

/* DOCUMENTACION */

PRIMER PUNTO
A = PATINDEX('%.%', ip)

PRIMER OCTETO
B = SUBSTRING(ip, 1, A-1)

Desarrollado
SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)

SEGUNDO PUNTO
C = PATINDEX('%.%', SUBSTRING(ip, LEN(B) + 2, 20)) + A

Desarrollado
PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%',
ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)

SEGUNDO OCTETO
D = SUBSTRING(ip, A + 1, C - A - 1)

Desarrollado
SUBSTRING(ip, PATINDEX('%.%', ip) + 1, (PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) - (PATINDEX('%.%', ip)) - 1)

TERCER PUNTO
E = C + PATINDEX('%.%', SUBSTRING(ip, C + 1, 20))

Desarrollado
(PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%',
ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) + (PATINDEX('%.%',
SUBSTRING(ip, PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip) + 1, 20)))

TERCER OCTETO
F = SUBSTRING(ip, C + 1, E - C - 1)

Desarrollado
SUBSTRING(ip, (PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) + 1,
((PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%',
ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) + (PATINDEX('%.%',
SUBSTRING(ip, PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip) + 1, 20)))) -
(PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%',
ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) - 1)

CUARTO OCTETO
G = SUBSTRING(ip, E + 1, LEN(RTRIM(LTRIM(ip))) - E)
Desarrollado
SUBSTRING(ip, ((PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) +
(PATINDEX('%.%', SUBSTRING(ip, PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip) + 1, 20)))) + 1, LEN(RTRIM(LTRIM(ip))) -
((PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%',
ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) + (PATINDEX('%.%',
SUBSTRING(ip, PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip) + 1, 20)))))

/* FIN DOCUMENTACION */

/* EJEMPLO */
/* En este ejemplo utilice esta logica para sincronizar una tabla donde
guardo informacion sobre Equipos que tienen IPs con un DNS, para lo
cual es necesario descomponer la IP en sus octetos */

CREATE TRIGGER T_I_Historico_U ON [dbo].[TEL_Equipos]
FOR UPDATE
AS

DECLARE

@NombreDNS VARCHAR(255),
@IP VARCHAR(15),
@TipoServicio INTEGER,
@IdEquipo INTEGER,
@GeneraDNS VARCHAR(1),
@NombreDNSAnt VARCHAR(255),
@IPAnt VARCHAR(15),
@TipoServicioAnt INTEGER,
@GeneraDNSAnt VARCHAR(1),
@Clave1 VARCHAR(255),
@Tabla VARCHAR(255),
@Campo VARCHAR(255),
@ValorAnt VARCHAR(255),
@Valor VARCHAR(255),
@Usuario VARCHAR(255),
@StringAux VARCHAR(255),
@DNSPTRBaja VARCHAR(255),
@DNSPTRAlta VARCHAR(255),
@DNSBaja VARCHAR(255),
@DNSAlta VARCHAR(255),
@IPANTPUNTO1 INTEGER,
@IPANTPUNTO2 INTEGER,
@IPANTPUNTO3 INTEGER,
@IPANTOCTETO1 VARCHAR(5),
@IPANTOCTETO2 VARCHAR(5),
@IPANTOCTETO3 VARCHAR(5),
@IPANTOCTETO4 VARCHAR(5),
@IPPUNTO1 INTEGER,
@IPPUNTO2 INTEGER,
@IPPUNTO3 INTEGER,
@IPOCTETO1 VARCHAR(5),
@IPOCTETO2 VARCHAR(5),
@IPOCTETO3 VARCHAR(5),
@IPOCTETO4 VARCHAR(5)

BEGIN

/* VALORES NUEVOS A GRABAR EN LA BD */

SELECT
@IdEquipo = IdEquipo,
@NombreDNS = RTRIM(LTRIM(NombreDNS)),
@IP = IP,
@TipoServicio = IdTipoServicio,
@GeneraDNS = GeneraDNS,
@Usuario = Usuario,
@IPPUNTO1 = PATINDEX('%.%', IP),
@IPPUNTO2 = PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip),
@IPPUNTO3 = (PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) +
(PATINDEX('%.%', SUBSTRING(ip, PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip) + 1, 20))),
@IPOCTETO1 = SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1),
@IPOCTETO2 = SUBSTRING(ip, PATINDEX('%.%', ip) + 1, (PATINDEX('%.%',
SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) - (PATINDEX('%.%', ip)) - 1),
@IPOCTETO3 = SUBSTRING(ip, (PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) + 1, ((PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) + (PATINDEX('%.%', SUBSTRING(ip, PATINDEX('%.%',
SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip) + 1, 20)))) - (PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) - 1),
@IPOCTETO4 = SUBSTRING(ip, ((PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) + (PATINDEX('%.%', SUBSTRING(ip, PATINDEX('%.%',
SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip) + 1, 20)))) + 1, LEN(RTRIM(LTRIM(ip))) -
((PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%',
ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) + (PATINDEX('%.%',
SUBSTRING(ip, PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip) + 1, 20)))))
FROM inserted

/* FIN VALORES NUEVOS A GRABAR EN LA BD */


/* VALORES EN LA BD ANTES DE LA GRABACION DE LOS NUEVOS */

SELECT
@NombreDNSAnt = RTRIM(LTRIM(NombreDNS)),
@IPAnt = IP,
@TipoServicioAnt = IdTipoServicio,
@GeneraDNSAnt = GeneraDNSAnt,
@IPANTPUNTO1 = PATINDEX('%.%', IP),
@IPANTPUNTO2 = PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip),
@IPANTPUNTO3 = (PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) +
(PATINDEX('%.%', SUBSTRING(ip, PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip) + 1, 20))),
@IPANTOCTETO1 = SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1),
@IPANTOCTETO2 = SUBSTRING(ip, PATINDEX('%.%', ip) + 1,
(PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%',
ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) - (PATINDEX('%.%', ip)) - 1),
@IPANTOCTETO3 = SUBSTRING(ip, (PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) + 1, ((PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) + (PATINDEX('%.%', SUBSTRING(ip, PATINDEX('%.%',
SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip) + 1, 20)))) - (PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) - 1),
@IPANTOCTETO4 = SUBSTRING(ip, ((PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) + (PATINDEX('%.%', SUBSTRING(ip, PATINDEX('%.%',
SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip) + 1, 20)))) + 1, LEN(RTRIM(LTRIM(ip))) -
((PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%',
ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) + (PATINDEX('%.%',
SUBSTRING(ip, PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip) + 1, 20)))))
FROM deleted

/* FIN VALORES EN LA BD ANTES DE LA GRABACION DE LOS NUEVOS */

/* HISTORICO DE CAMBIOS */

SET @Tabla = 'TEL_Equipos'

IF @NombreDNSAnt <> @NombreDNS
BEGIN
SET @Campo = 'NombreDNS'
SET @ValorAnt = @NombreDNSAnt
SET @Valor = @NombreDNS
SET @Clave1 = STR(@IdEquipo)
INSERT [dbo].[TEL_HistoricoCambios] (FECHA, TABLA,
CAMPO, VALORANTERIOR, VALORACTUAL, USUARIO, CLAVE1) values (GETDATE(),
@Tabla, @Campo, @ValorAnt, @Valor, @Usuario, @Clave1)
END

IF @IPAnt <> @IP
BEGIN
SET @Campo = 'IP'
SET @ValorAnt = @IPAnt
SET @Valor = @IP
SET @Clave1 = STR(@IdEquipo)
INSERT [dbo].[TEL_HistoricoCambios] (FECHA, TABLA, CAMPO,
VALORANTERIOR, VALORACTUAL, USUARIO, CLAVE1) values (GETDATE(), @Tabla,
@Campo, @ValorAnt, @Valor, @Usuario, @Clave1)
END

IF @TipoServicioAnt <> @TipoServicio
BEGIN
SET @Campo = 'IdTipoServicio'
SET @ValorAnt = STR(@TipoServicioAnt)
SET @Valor = STR(@TipoServicio)
SET @Clave1 = STR(@IdEquipo)
INSERT [dbo].[TEL_HistoricoCambios] (FECHA, TABLA,
CAMPO, VALORANTERIOR, VALORACTUAL, USUARIO, CLAVE1) values (GETDATE(),
@Tabla, @Campo, @ValorAnt, @Valor, @Usuario, @Clave1)
END

/* FIN HISTORICO DE CAMBIOS */

/* SINCRONIZACION CON DNS */

/* SI ANTES NO ACTUALIZABA EL DNS Y AHORA SI ==> ALTA EN EL DNS */

IF (@GeneraDNSAnt = 'N') AND (@GeneraDNS = 'S')
BEGIN
SET @DNSAlta = 'dnscmd 192.168.2.1 /RecordAdd
telecom.ute.com.uy ' + @NombreDNS + ' A ' + @IP
SET @DNSPTRAlta = 'dnscmd 192.168.2.1 /RecordAdd ' + @IPOCTETO1
+ '.in-addr.arpa ' + @IPOCTETO4 + '.' + @IPOCTETO3 + '.' + @IPOCTETO2 +
' PTR ' + @NombreDNS + '.'
EXEC MASTER..XP_CMDSHELL @StringAux
SET @StringAux = 'echo ' + @DNSAlta + ' >>
C:\DNS\ActualizaDNS.bat'
EXEC MASTER..XP_CMDSHELL @StringAux
SET @StringAux = 'echo ' + @DNSPTRAlta + ' >>
C:\DNS\ActualizaDNS.bat'
EXEC MASTER..XP_CMDSHELL @StringAux
END

/* SI ANTES ACTUALIZABA EL DNS Y AHORA NO ==> BAJA EN EL DNS */

IF (@GeneraDNSAnt = 'S') AND (@GeneraDNS = 'N')
BEGIN
SET @DNSPTRBaja = 'dnscmd 192.168.2.1 /RecordDelete ' +
@IPANTOCTETO1 + '.in-addr.arpa ' + @IPANTOCTETO4 + '.' + @IPANTOCTETO3
+ '.' + @IPANTOCTETO2 + ' PTR ' + @NombreDNSAnt + '. /f '
SET @DNSBaja = 'dnscmd 192.168.2.1 /RecordDelete
telecom.ute.com.uy ' + @NombreDNSAnt + ' A /f '
SET @StringAux = 'echo ' + @DNSPTRBaja + ' >>
C:\DNS\ActualizaDNS.bat'
EXEC MASTER..XP_CMDSHELL @StringAux
SET @StringAux = 'echo ' + @DNSBaja + ' >>
C:\DNS\ActualizaDNS.bat'
EXEC MASTER..XP_CMDSHELL @StringAux
END

/* SI ANTES ACTUALIZABA EL DNS Y AHORA SIGUE ACTUALIZANDO ==> ME FIJO
SI CAMBIO EL NOMBRE O LA IP */

IF ((@GeneraDNSAnt = 'S') AND (@GeneraDNS = 'S')) AND ((@NombreDNSAnt
<> @NombreDNS) OR (@IPAnt <> @IP))
BEGIN
SET @DNSPTRBaja = 'dnscmd 192.168.2.1 /RecordDelete ' +
@IPANTOCTETO1 + '.in-addr.arpa ' + @IPANTOCTETO4 + '.' + @IPANTOCTETO3
+ '.' + @IPANTOCTETO2 + ' PTR ' + @NombreDNSAnt + '. /f '
SET @DNSBaja = 'dnscmd 192.168.2.1 /RecordDelete
telecom.ute.com.uy ' + @NombreDNSAnt + ' A /f '
SET @DNSAlta = 'dnscmd 192.168.2.1 /RecordAdd
telecom.ute.com.uy ' + @NombreDNS + ' A ' + @IP
SET @DNSPTRAlta = 'dnscmd 192.168.2.1 /RecordAdd ' + @IPOCTETO1
+ '.in-addr.arpa ' + @IPOCTETO4 + '.' + @IPOCTETO3 + '.' + @IPOCTETO2 +
' PTR ' + @NombreDNS + '.'
SET @StringAux = 'echo ' + @DNSPTRBaja + ' >>
C:\DNS\ActualizaDNS.bat'
EXEC MASTER..XP_CMDSHELL @StringAux
SET @StringAux = 'echo ' + @DNSBaja + ' >>
C:\DNS\ActualizaDNS.bat'
EXEC MASTER..XP_CMDSHELL @StringAux
SET @StringAux = 'echo ' + @DNSAlta + ' >>
C:\DNS\ActualizaDNS.bat'
EXEC MASTER..XP_CMDSHELL @StringAux
SET @StringAux = 'echo ' + @DNSPTRAlta + ' >>
C:\DNS\ActualizaDNS.bat'
EXEC MASTER..XP_CMDSHELL @StringAux
END

/* FIN SINCRONIZACION CON DNS */

END

/* FIN EJEMPLO */
 

Leer las respuestas

#1 Alejandro Mesa
11/08/2006 - 18:46 | Informe spam
,

Gracias por compartir el codigo con el grupo. Ve si esto te es de alguna
utilidad.


select identity(int, 1, 1) as number
into dbo.number
from sysobjects
go

declare @s varchar(50)

set @s = '192.168.2.1'

select
len(substring('.' + s.s1 + '.', 1, n.number)) - len(replace(substring('.' +
s.s1 + '.', 1, n.number), '.', '')) as POSICION_OCTETO,
substring('.' + s.s1 + '.', n.number + 1, charindex('.', '.' + s.s1 + '.',
n.number + 1) - (n.number + 1)) as VALOR_OCTETO
from
(select @s as s1) as s, dbo.number as n
where
datalength('.' + s.s1 + '.') > n.number
and substring('.' + s.s1 + '.', n.number, 1) = '.'
order by
n.number
go

drop table dbo.number
go


AMB

"" wrote:

Comparto con ustedes esta lógica que sirve para descomponer un campo
que contenga una IP válida en todos sus octetos. Esto esta hecho
utilizando únicamente SQL transaccional.

/* DOCUMENTACION */

PRIMER PUNTO
A = PATINDEX('%.%', ip)

PRIMER OCTETO
B = SUBSTRING(ip, 1, A-1)

Desarrollado
SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)

SEGUNDO PUNTO
C = PATINDEX('%.%', SUBSTRING(ip, LEN(B) + 2, 20)) + A

Desarrollado
PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%',
ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)

SEGUNDO OCTETO
D = SUBSTRING(ip, A + 1, C - A - 1)

Desarrollado
SUBSTRING(ip, PATINDEX('%.%', ip) + 1, (PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) - (PATINDEX('%.%', ip)) - 1)

TERCER PUNTO
E = C + PATINDEX('%.%', SUBSTRING(ip, C + 1, 20))

Desarrollado
(PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%',
ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) + (PATINDEX('%.%',
SUBSTRING(ip, PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip) + 1, 20)))

TERCER OCTETO
F = SUBSTRING(ip, C + 1, E - C - 1)

Desarrollado
SUBSTRING(ip, (PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) + 1,
((PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%',
ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) + (PATINDEX('%.%',
SUBSTRING(ip, PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip) + 1, 20)))) -
(PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%',
ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) - 1)

CUARTO OCTETO
G = SUBSTRING(ip, E + 1, LEN(RTRIM(LTRIM(ip))) - E)
Desarrollado
SUBSTRING(ip, ((PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) +
(PATINDEX('%.%', SUBSTRING(ip, PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip) + 1, 20)))) + 1, LEN(RTRIM(LTRIM(ip))) -
((PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%',
ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) + (PATINDEX('%.%',
SUBSTRING(ip, PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip) + 1, 20)))))

/* FIN DOCUMENTACION */

/* EJEMPLO */
/* En este ejemplo utilice esta logica para sincronizar una tabla donde
guardo informacion sobre Equipos que tienen IPs con un DNS, para lo
cual es necesario descomponer la IP en sus octetos */

CREATE TRIGGER T_I_Historico_U ON [dbo].[TEL_Equipos]
FOR UPDATE
AS

DECLARE

@NombreDNS VARCHAR(255),
@IP VARCHAR(15),
@TipoServicio INTEGER,
@IdEquipo INTEGER,
@GeneraDNS VARCHAR(1),
@NombreDNSAnt VARCHAR(255),
@IPAnt VARCHAR(15),
@TipoServicioAnt INTEGER,
@GeneraDNSAnt VARCHAR(1),
@Clave1 VARCHAR(255),
@Tabla VARCHAR(255),
@Campo VARCHAR(255),
@ValorAnt VARCHAR(255),
@Valor VARCHAR(255),
@Usuario VARCHAR(255),
@StringAux VARCHAR(255),
@DNSPTRBaja VARCHAR(255),
@DNSPTRAlta VARCHAR(255),
@DNSBaja VARCHAR(255),
@DNSAlta VARCHAR(255),
@IPANTPUNTO1 INTEGER,
@IPANTPUNTO2 INTEGER,
@IPANTPUNTO3 INTEGER,
@IPANTOCTETO1 VARCHAR(5),
@IPANTOCTETO2 VARCHAR(5),
@IPANTOCTETO3 VARCHAR(5),
@IPANTOCTETO4 VARCHAR(5),
@IPPUNTO1 INTEGER,
@IPPUNTO2 INTEGER,
@IPPUNTO3 INTEGER,
@IPOCTETO1 VARCHAR(5),
@IPOCTETO2 VARCHAR(5),
@IPOCTETO3 VARCHAR(5),
@IPOCTETO4 VARCHAR(5)

BEGIN

/* VALORES NUEVOS A GRABAR EN LA BD */

SELECT
@IdEquipo = IdEquipo,
@NombreDNS = RTRIM(LTRIM(NombreDNS)),
@IP = IP,
@TipoServicio = IdTipoServicio,
@GeneraDNS = GeneraDNS,
@Usuario = Usuario,
@IPPUNTO1 = PATINDEX('%.%', IP),
@IPPUNTO2 = PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip),
@IPPUNTO3 = (PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) +
(PATINDEX('%.%', SUBSTRING(ip, PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip) + 1, 20))),
@IPOCTETO1 = SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1),
@IPOCTETO2 = SUBSTRING(ip, PATINDEX('%.%', ip) + 1, (PATINDEX('%.%',
SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) - (PATINDEX('%.%', ip)) - 1),
@IPOCTETO3 = SUBSTRING(ip, (PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) + 1, ((PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) + (PATINDEX('%.%', SUBSTRING(ip, PATINDEX('%.%',
SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip) + 1, 20)))) - (PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) - 1),
@IPOCTETO4 = SUBSTRING(ip, ((PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) + (PATINDEX('%.%', SUBSTRING(ip, PATINDEX('%.%',
SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip) + 1, 20)))) + 1, LEN(RTRIM(LTRIM(ip))) -
((PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%',
ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) + (PATINDEX('%.%',
SUBSTRING(ip, PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip) + 1, 20)))))
FROM inserted

/* FIN VALORES NUEVOS A GRABAR EN LA BD */


/* VALORES EN LA BD ANTES DE LA GRABACION DE LOS NUEVOS */

SELECT
@NombreDNSAnt = RTRIM(LTRIM(NombreDNS)),
@IPAnt = IP,
@TipoServicioAnt = IdTipoServicio,
@GeneraDNSAnt = GeneraDNSAnt,
@IPANTPUNTO1 = PATINDEX('%.%', IP),
@IPANTPUNTO2 = PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip),
@IPANTPUNTO3 = (PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) +
(PATINDEX('%.%', SUBSTRING(ip, PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip) + 1, 20))),
@IPANTOCTETO1 = SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1),
@IPANTOCTETO2 = SUBSTRING(ip, PATINDEX('%.%', ip) + 1,
(PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%',
ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) - (PATINDEX('%.%', ip)) - 1),
@IPANTOCTETO3 = SUBSTRING(ip, (PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) + 1, ((PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) + (PATINDEX('%.%', SUBSTRING(ip, PATINDEX('%.%',
SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip) + 1, 20)))) - (PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) - 1),
@IPANTOCTETO4 = SUBSTRING(ip, ((PATINDEX('%.%', SUBSTRING(ip,
LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip)) + (PATINDEX('%.%', SUBSTRING(ip, PATINDEX('%.%',
SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%', ip)-1)) + 2, 20)) +
PATINDEX('%.%', ip) + 1, 20)))) + 1, LEN(RTRIM(LTRIM(ip))) -
((PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1, PATINDEX('%.%',
ip)-1)) + 2, 20)) + PATINDEX('%.%', ip)) + (PATINDEX('%.%',
SUBSTRING(ip, PATINDEX('%.%', SUBSTRING(ip, LEN(SUBSTRING(ip, 1,
PATINDEX('%.%', ip)-1)) + 2, 20)) + PATINDEX('%.%', ip) + 1, 20)))))
FROM deleted

/* FIN VALORES EN LA BD ANTES DE LA GRABACION DE LOS NUEVOS */

/* HISTORICO DE CAMBIOS */

SET @Tabla = 'TEL_Equipos'

IF @NombreDNSAnt <> @NombreDNS
BEGIN
SET @Campo = 'NombreDNS'
SET @ValorAnt = @NombreDNSAnt
SET @Valor = @NombreDNS
SET @Clave1 = STR(@IdEquipo)
INSERT [dbo].[TEL_HistoricoCambios] (FECHA, TABLA,
CAMPO, VALORANTERIOR, VALORACTUAL, USUARIO, CLAVE1) values (GETDATE(),
@Tabla, @Campo, @ValorAnt, @Valor, @Usuario, @Clave1)
END

IF @IPAnt <> @IP
BEGIN
SET @Campo = 'IP'
SET @ValorAnt = @IPAnt
SET @Valor = @IP
SET @Clave1 = STR(@IdEquipo)
INSERT [dbo].[TEL_HistoricoCambios] (FECHA, TABLA, CAMPO,
VALORANTERIOR, VALORACTUAL, USUARIO, CLAVE1) values (GETDATE(), @Tabla,
@Campo, @ValorAnt, @Valor, @Usuario, @Clave1)
END

IF @TipoServicioAnt <> @TipoServicio
BEGIN
SET @Campo = 'IdTipoServicio'
SET @ValorAnt = STR(@TipoServicioAnt)
SET @Valor = STR(@TipoServicio)
SET @Clave1 = STR(@IdEquipo)
INSERT [dbo].[TEL_HistoricoCambios] (FECHA, TABLA,
CAMPO, VALORANTERIOR, VALORACTUAL, USUARIO, CLAVE1) values (GETDATE(),
@Tabla, @Campo, @ValorAnt, @Valor, @Usuario, @Clave1)
END

/* FIN HISTORICO DE CAMBIOS */

/* SINCRONIZACION CON DNS */

/* SI ANTES NO ACTUALIZABA EL DNS Y AHORA SI ==> ALTA EN EL DNS */

IF (@GeneraDNSAnt = 'N') AND (@GeneraDNS = 'S')
BEGIN
SET @DNSAlta = 'dnscmd 192.168.2.1 /RecordAdd
telecom.ute.com.uy ' + @NombreDNS + ' A ' + @IP
SET @DNSPTRAlta = 'dnscmd 192.168.2.1 /RecordAdd ' + @IPOCTETO1
+ '.in-addr.arpa ' + @IPOCTETO4 + '.' + @IPOCTETO3 + '.' + @IPOCTETO2 +
' PTR ' + @NombreDNS + '.'
EXEC MASTER..XP_CMDSHELL @StringAux
SET @StringAux = 'echo ' + @DNSAlta + ' >>
C:\DNS\ActualizaDNS.bat'
EXEC MASTER..XP_CMDSHELL @StringAux
SET @StringAux = 'echo ' + @DNSPTRAlta + ' >>
C:\DNS\ActualizaDNS.bat'
EXEC MASTER..XP_CMDSHELL @StringAux
END

/* SI ANTES ACTUALIZABA EL DNS Y AHORA NO ==> BAJA EN EL DNS */

IF (@GeneraDNSAnt = 'S') AND (@GeneraDNS = 'N')
BEGIN
SET @DNSPTRBaja = 'dnscmd 192.168.2.1 /RecordDelete ' +
@IPANTOCTETO1 + '.in-addr.arpa ' + @IPANTOCTETO4 + '.' + @IPANTOCTETO3
+ '.' + @IPANTOCTETO2 + ' PTR ' + @NombreDNSAnt + '. /f '
SET @DNSBaja = 'dnscmd 192.168.2.1 /RecordDelete
telecom.ute.com.uy ' + @NombreDNSAnt + ' A /f '
SET @StringAux = 'echo ' + @DNSPTRBaja + ' >>
C:\DNS\ActualizaDNS.bat'
EXEC MASTER..XP_CMDSHELL @StringAux
SET @StringAux = 'echo ' + @DNSBaja + ' >>
C:\DNS\ActualizaDNS.bat'
EXEC MASTER..XP_CMDSHELL @StringAux
END

/* SI ANTES ACTUALIZABA EL DNS Y AHORA SIGUE ACTUALIZANDO ==> ME FIJO
SI CAMBIO EL NOMBRE O LA IP */

IF ((@GeneraDNSAnt = 'S') AND (@GeneraDNS = 'S')) AND ((@NombreDNSAnt
<> @NombreDNS) OR (@IPAnt <> @IP))
BEGIN
SET @DNSPTRBaja = 'dnscmd 192.168.2.1 /RecordDelete ' +
@IPANTOCTETO1 + '.in-addr.arpa ' + @IPANTOCTETO4 + '.' + @IPANTOCTETO3
+ '.' + @IPANTOCTETO2 + ' PTR ' + @NombreDNSAnt + '. /f '
SET @DNSBaja = 'dnscmd 192.168.2.1 /RecordDelete
telecom.ute.com.uy ' + @NombreDNSAnt + ' A /f '
SET @DNSAlta = 'dnscmd 192.168.2.1 /RecordAdd
telecom.ute.com.uy ' + @NombreDNS + ' A ' + @IP
SET @DNSPTRAlta = 'dnscmd 192.168.2.1 /RecordAdd ' + @IPOCTETO1
+ '.in-addr.arpa ' + @IPOCTETO4 + '.' + @IPOCTETO3 + '.' + @IPOCTETO2 +
' PTR ' + @NombreDNS + '.'
SET @StringAux = 'echo ' + @DNSPTRBaja + ' >>
C:\DNS\ActualizaDNS.bat'
EXEC MASTER..XP_CMDSHELL @StringAux
SET @StringAux = 'echo ' + @DNSBaja + ' >>
C:\DNS\ActualizaDNS.bat'
EXEC MASTER..XP_CMDSHELL @StringAux
SET @StringAux = 'echo ' + @DNSAlta + ' >>
C:\DNS\ActualizaDNS.bat'

Preguntas similares