SQL Script - Проверьте, был ли IP занесен в черный список - PullRequest
6 голосов
/ 28 июля 2010

Я изучаю SQL, и мне бы хотелось, чтобы вы посоветовали узнать, правильно ли написан этот код, или лучший способ сделать это. Этот скрипт создаю:

  • таблица для хранения IP-адресов, занесенных в черный список
  • sproc, позволяющий разделять IP-адрес на 4 октета
  • SPROC, позволяющий проверить, находится ли IP в черном списке или нет Пожалуйста, дайте мне знать! спасибо!

    -- Black Listed Table
    CREATE TABLE UtlBlacklistedIPs 
            ( 
                octet1 TINYINT, 
                octet2 TINYINT, 
                octet3 TINYINT, 
                octet4 TINYINT 
            );
    

1 SPROC

    -- Convert an IP address in 4 octet for db storing
  CREATE PROCEDURE dbo.storeIPoctetsv1 
   @ip CHAR(15) 
  AS 
  BEGIN 
   SET NOCOUNT ON 
   INSERT UtlBlacklistedIPs(octet1, octet2, octet3, octet4) 
    SELECT 
     CONVERT(TINYINT, PARSENAME(@ip, 4)), 
     CONVERT(TINYINT, PARSENAME(@ip, 3)), 
     CONVERT(TINYINT, PARSENAME(@ip, 2)), 
     CONVERT(TINYINT, PARSENAME(@ip, 1)) 
  END

2 SPROC

-- SPROC check if an IP address has been black listed
CREATE PROCEDURE dbo.sprocCheckIp
     @ip CHAR(15)
    AS
    BEGIN
     SET NOCOUNT ON
     DECLARE
     @octet1 tinyint,
     @octet2 tinyint,
     @octet3 tinyint,
     @octet4 tinyint;

     SET @octet1 = CONVERT(tinyint, PARSENAME(@ip, 4)); 
     SET @octet2 = CONVERT(tinyint, PARSENAME(@ip, 3));
     SET @octet3 = CONVERT(tinyint, PARSENAME(@ip, 2));
     SET @octet4 = CONVERT(tinyint, PARSENAME(@ip, 1));

     IF EXISTS ( 
      SELECT octet1, octet2, octet3, octet4
      FROM UtlBlacklistedIPs
      WHERE
      octet1 =@octet1
      AND octet2 =@octet2
      AND octet3 =@octet3
      AND octet4 =@octet4
      )
       BEGIN
        PRINT 'Ip: '+@ip+' is black listed'
       END

      ELSE
       BEGIN     
        PRINT 'Ip: '+@ip+' is NOT black listed'
       END     
    END

Некоторые значения

    -- Insert dummy values
DECLARE @i INT 
SET @i = 0 
WHILE @i < 2000 
BEGIN 

    EXEC dbo.storeIPoctetsv1 @ip = '204.71.34.21' 
    EXEC dbo.storeIPoctetsv1 @ip = '12.38.145.32' 
    EXEC dbo.storeIPoctetsv1 @ip = '127.0.0.1' 

    SET @i = @i + 1 
END

Используйте SPROC

    -- Use SPROc
    EXEC dbo.sprocCheckIp '125.254.125.111' -- NOT black listed Ip
    EXEC dbo.sprocCheckIp '204.71.34.21' -- black listed Ip

Ответы [ 2 ]

3 голосов
/ 28 июля 2010

Я предполагаю, что вы собираетесь использовать это за пределами базы данных, предположительно в .NET?В этом случае я бы изменил структуру следующим образом:

  • SProc для хранения черного списка IP-адресов с четырьмя октетами в качестве ввода
  • SProc для проверки любого IP-адреса с четырьмя октетамив качестве ввода и 0 или 1 в качестве вывода (используя RETURN, а не PRINT)
  • Вместо этого выполните разделение IP-адресов в .NET.SQL Server имеет очень плохую обработку строк, поэтому вам лучше написать класс Ip со статическим методом int[] ToOctets(string ip), который обрабатывает это для вас.Вы будете использовать его следующим образом: var octs = Ip.ToOctets("213.82.158.93")
  • Когда вы проверяете, занесен ли IP в черный список или нет, вы вызываете ExecuteScalar (или любой другой метод для получения скалярного значения из хранимой процедуры.с разъемом, который вы предпочитаете), чтобы получить результат.
1 голос
/ 28 июля 2010

Я согласен с Томасом, но у меня есть вопрос: почему вы храните IP в 4 отдельных столбцах? Если весь смысл упражнения заключается в отслеживании «черных списков IP-адресов», то когда вам когда-нибудь понадобится проверить только часть IP-адреса - разве вы не всегда будете смотреть на все это? Таким образом, разделение / повторное объединение октетов кажется ненужным. Это заставляет вас писать много лишнего T-SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...