2010-07-28 110 views
6

我學習SQL,我想你的建議,看看這個代碼編寫正確,或者更好的方式來做到這一點。 該腳本創建:SQL腳本 - 檢查一個IP已被列入黑名單

  • 一個表來存儲被列入黑名單
  • 一個存儲過程的IP地址,以便在4字節的
  • 一個存儲過程,允許檢查隨地吐痰的IP地址,如果一個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 [email protected] 
     AND octet2 [email protected] 
     AND octet3 [email protected] 
     AND octet4 [email protected] 
    ) 
     BEGIN 
     PRINT 'Ip: '[email protected]+' is black listed' 
     END 

     ELSE 
     BEGIN  
     PRINT 'Ip: '[email protected]+' 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 
+0

+1有趣的使用'PARSENAME' – 2010-07-28 06:37:50

+0

商店的IPv4地址爲int(因爲那是它是什麼)。四部分的虛線表示只是一種表示。 – 2011-08-26 19:31:57

回答

3

我假設你打算在數據庫之外使用這個,大概是在.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(或任何方法來獲取從存儲過程標值可能與你喜歡的連接器被稱爲)來獲得結果。
+0

感謝Tomas,感謝您的建議! – GibboK 2010-07-28 06:59:59

1

我同意托馬斯,但確實有一個問題:你爲什麼要將IP存儲在4個獨立的列中?如果練習的要點是跟蹤「黑名單IP地址」,那麼您何時需要檢查IP地址的一部分 - 您是不是一直在關注整個事情?因此分割/重新組合八位組似乎是不必要的。它會導致你寫很多額外的T-SQL。

+0

使用4個字節的存儲爲TINYINT你分貝節省空間,而不是ID您用來存儲你將結束IPS配有15個字節的數據類型 – GibboK 2010-07-29 07:53:52

+2

獨特的CHAR(15)我發現測試(我認爲你正在使用作爲您的參考)大約10年前完成,比較微小的int,int和char(http://sqlserver2000.databases.aspfaq.com/how-should-i-store-an-ip-address-in-sql-server.html)I不過,如果是2000分貝,如果使用varchar而不是char,smallint而不是int,或者其他可用的改進值得再次使用更現代的數據庫(SQL-2005或2008等)自2000年以來。 – dave 2010-07-29 15:53:12