2012-05-04 7 views
2

IP 주소는 다음과 같은 방법으로 내 테이블에 저장됩니다.테이블의 IP 주소 목록에 대해 사용자의 IP 주소를 확인하려면 어떻게합니까?

192.12.34.12 
192.12.#.12 
192.#.34.12 

이제 내 응용 프로그램에서 .net 코드를 사용하여 로그인 한 사용자의 IP 주소를 캡처하여이 테이블에 대한 사용자 IP 주소를 자동으로 유효화하려고합니다.

사용자 IP가 지금 경우

192.12.34.12 
192.12.45.12 

192.56.34.12-- it should be valid. 
191.12.34.12-- Invalid 
나는 SQL 쿼리 또는이 테이블에 대해 사용자의 IP 주소를 기록 유효성을 검사하는 저장된 프로 시저를 만들 수있는 방법

?

답변

1

방문자 IP의 숫자를 점 (점 사이)의 각 위치에서 '#'로 바꾸고 WHERE 절을 정규화 할 수 있습니다. 따라서 5 개의 비교가 포함 된 where 절 (하나는 직접 일치, 4 개는 각 위치에 대체 #가 있음)이있는 명령문이 표시됩니다.

CHARINDEX를 사용하여 점을 찾고 SUBSTRING을 사용하여 비교 varchars를 빌드 할 수 있습니다.

+3

행운을 빕니다. – Styxxy

+0

또한 예제가 단순화되었고 5 개 이상의 비교가 필요하다고 생각합니다. 어쩌면 ... ㅎ –

+0

당신은 #. #. #. # –

4

이처럼 LIKE 연산자를 사용해보십시오 : 당신이 (이 어떤 인덱스를 사용할 수 없습니다) 테이블의 레코드 많은 경우

SELECT * 
FROM IPRecords 
WHERE @UsersIp like replace(IP, '#', '%') 

그러나이 방법은 매우 문제가 성능 현명 할 수 있습니다. 성능이 정말 문제가있는 경우에

, 다른 방법이 될 수있다 :

  • 네 개의 숫자 열 (와일드 카드를 표시 예를 들어하기
  • 사용 null에 걸쳐 IP 분할, 마지막 규칙은 192, null, 34, 12이 될 것입니다)
  • 클라이언트
  • 해당 4 개 부분으로 분할 IP와 같은 조건을 사용

    WHERE ([email protected] OR IP1 is null) AND ([email protected] OR IP2 is null) AND ...

이렇게하면 필요한 경우 속도를 높이기 위해 4 개 열의 색인을 사용할 수 있다고 생각합니다.

3

PARSENAME 함수를 사용하여 IP 주소 값을 네 부분으로 나누어 개별적으로 비교할 수 있습니다.

작성 및 테스트 데이터 스크립트 채 웁니다 : 우리는 IPv6 로의 이동하면, 롤

CREATE TABLE ipaddresses 
( 
    ip VARCHAR(20) NOT NULL 
); 

INSERT INTO ipaddresses (ip) VALUES 
    ('192.12.34.12'), 
    ('192.12.#.12'), 
    ('192.#.34.12'); 

시나리오 # 1

DECLARE @userip VARCHAR(20) 
SET  @userip = '192.56.34.12' 

;WITH ips AS 
(
    SELECT REPLACE(ip, '#', '%') AS ip 
    FROM ipaddresses 
) 
SELECT COUNT(ip) AS validcount 
FROM ips 
WHERE PARSENAME(@userip, 1) LIKE PARSENAME(ip, 1) 
AND  PARSENAME(@userip, 2) LIKE PARSENAME(ip, 2) 
AND  PARSENAME(@userip, 3) LIKE PARSENAME(ip, 3) 
AND  PARSENAME(@userip, 4) LIKE PARSENAME(ip, 4); 

VALIDCOUNT 
---------- 
    1 

시나리오 # 2

DECLARE @userip VARCHAR(20) 
SET  @userip = '191.12.34.12' 

;WITH ips AS 
(
    SELECT REPLACE(ip, '#', '%') AS ip 
    FROM ipaddresses 
) 
SELECT COUNT(ip) AS validcount 
FROM ips 
WHERE PARSENAME(@userip, 1) LIKE PARSENAME(ip, 1) 
AND  PARSENAME(@userip, 2) LIKE PARSENAME(ip, 2) 
AND  PARSENAME(@userip, 3) LIKE PARSENAME(ip, 3) 
AND  PARSENAME(@userip, 4) LIKE PARSENAME(ip, 4); 

VALIDCOUNT 
---------- 
    0