CREATE TABLE [dbo].[host] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[fqdn] [varchar] (255) COLLATE Latin1_General_CI_AS NULL ,
[ip] [varchar] (15) COLLATE Latin1_General_CI_AS NOT NULL ,
[os] [varchar] (255) COLLATE Latin1_General_CI_AS NULL ,
[first_seen] [datetime] NULL ,
[last_seen] [datetime] NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[hopper_host] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[fqdn] [varchar] (255) COLLATE Latin1_General_CI_AS NULL ,
[ip] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL ,
[os] [varchar] (255) COLLATE Latin1_General_CI_AS NULL ,
[first_seen] [datetime] NULL ,
[last_seen] [datetime] NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[port] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[host_id] [int] NOT NULL ,
[port] [int] NOT NULL ,
[protocol] [char] (1) COLLATE Latin1_General_CI_AS NULL ,
[service] [varchar] (255) COLLATE Latin1_General_CI_AS NULL ,
[first_seen] [datetime] NULL ,
[last_seen] [datetime] NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[hopper_port] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[ip] [varchar] (15) COLLATE Latin1_General_CI_AS NOT NULL ,
[port] [int] NOT NULL ,
[protocol] [char] (1) COLLATE Latin1_General_CI_AS NULL ,
[service] [varchar] (255) COLLATE Latin1_General_CI_AS NULL ,
[first_seen] [datetime] NULL ,
[last_seen] [datetime] NULL
) ON [PRIMARY]
GO
CREATE PROCEDURE dbo.sp_tracer AS
DECLARE @group_insert INT
DECLARE @group_update INT
DECLARE @counter INT
DECLARE @host_id INT
DECLARE @hh_id INT
DECLARE @hh_ip VARCHAR(15)
DECLARE @hh_fqdn VARCHAR(255)
DECLARE @hh_os VARCHAR(255)
DECLARE @hh_first_seen DATETIME
DECLARE @hh_last_seen DATETIME
DECLARE @port_id INT
DECLARE @hh_port INT
DECLARE @hh_protocol CHAR(1)
DECLARE @hh_service VARCHAR(255)
-- populate host
SELECT @hh_id = MIN(id) FROM hopper_host
WHILE @hh_id IS NOT NULL
BEGIN
SELECT @hh_ip = ip, @hh_fqdn = fqdn, @hh_os = os, @hh_first_seen = first_seen, @hh_last_seen = last_seen FROM hopper_host WHERE id = @hh_id
SELECT @host_id = id FROM host WHERE ip = @hh_ip
IF @host_id IS NULL BEGIN
INSERT INTO host (fqdn, ip, os, first_seen, last_seen) VALUES (@hh_fqdn, @hh_ip, @hh_os, @hh_first_seen, @hh_last_seen)
END
ELSE BEGIN
UPDATE host SET fqdn = @hh_fqdn, os = @hh_os, last_seen = @hh_last_seen WHERE id = @host_id AND last_seen <= @hh_last_seen
END
SET @host_id = NULL
SELECT @hh_id = MIN(id) FROM hopper_host WHERE id > @hh_id
END
DELETE FROM hopper_host
-- populate port
SELECT @hh_id = MIN(id) FROM hopper_port
WHILE @hh_id IS NOT NULL
BEGIN
SELECT @hh_ip = ip, @hh_port = port, @hh_protocol = protocol, @hh_service = service, @hh_first_seen = first_seen, @hh_last_seen = last_seen FROM hopper_port WHERE id = @hh_id
SELECT @host_id = id FROM host WHERE ip = @hh_ip
SELECT @port_id = id FROM port WHERE host_id = @host_id AND port = @hh_port
IF @port_id IS NULL BEGIN
INSERT INTO port (host_id, port, protocol, service, first_seen, last_seen) VALUES (@host_id, @hh_port, @hh_protocol, @hh_service, @hh_first_seen, @hh_last_seen)
END
ELSE BEGIN
UPDATE port SET protocol = @hh_protocol, service = @hh_service, last_seen = @hh_last_seen WHERE id = @port_id AND last_seen <= @hh_last_seen
END
SET @port_id = NULL
SELECT @hh_id = MIN(id) FROM hopper_port WHERE id > @hh_id
END
DELETE FROM hopper_port
GO