2

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

このテーブルに対してログインしているユーザーの IP アドレスを検証する SQL クエリまたはストアド プロシージャを作成するにはどうすればよいですか?

4

3 に答える 3

4

LIKE次のように、演算子を使用してみてください。

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

ただし、このアプローチは、テーブルに多数のレコードがある場合 (インデックスを使用できない場合)、パフォーマンスに関して非常に問題になる可能性があります。

パフォーマンスが本当に問題である場合は、別のアプローチとして次のことが考えられます。

  • IP を 4 つの数値列に分割する
  • ワイルドカードを示すために使用nullします (たとえば、最後のルールは になります192, null, 34, 12)
  • クライアントで、IP を対応する 4 つの部分に分割し、次のような条件を使用します。

    WHERE (IP1=@IP1 OR IP1 is null) AND (IP2=@IP2 OR IP2 is null) AND ...

このようにして、必要に応じて 4 つの列にインデックスを使用して高速化できると思います。

于 2012-05-04T15:04:37.023 に答える
3

PARSENAME 関数を使用して、IP アドレスの値を 4 つの部分に分割し、個別に比較できます。

テスト データ スクリプトを作成して入力します

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
于 2012-05-04T15:15:18.133 に答える
1

各位置 (ドット間) で訪問者 IP の番号を「#」に置き換えるステートメントを実行し、通常の WHERE 句を実行できます。したがって、5 つの比較を含む where 句を含むステートメントが得られます (1 つは直接一致、4 つは各位置の置換 #)。

CHARINDEX を使用してドットを検索し、SUBSTRING を使用して比較 varchar を作成できます。

于 2012-05-04T15:01:19.573 に答える