IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Deux index conditionnels qui couvrent 100% des lignes : utile ou pas ?


Sujet :

Développement SQL Server

  1. #1
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut Deux index conditionnels qui couvrent 100% des lignes : utile ou pas ?
    Bonjour,

    Je m'apprête à créer les éléments suivants dans une base de données.

    Il s'agit de stocker toutes les tentatives de connexion à un logiciel en loguant l'IP.
    Après 3 tentatives erronées, le but est de bloquer l'utilisateur de manière exponentielle afin de l'empêcher de faire un brute force.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    create table connection
    (
    	id int identity primary key,
    	instant datetime2 not null default SYSDATETIME(),
    	[ip] binary(4) not null,
    	[status] bit not null
    );
    go
     
    create unique index uix_connection_error on connection([ip], instant) where [status] = 0;
    go
     
    create unique index uix_connection_success on connection([ip], instant) where [status] = 1;
    go
     
    create procedure dbo.CreateConnection
    (
    	@ip binary(4),
    	@status bit
    )
    as
    begin
    	insert into connection ([ip], [status]) values (@ip, @status);
    end;
    go
     
    create function dbo.GetNextLoginAttemptDate(@ip binary(4))
    returns datetime2
    as
    begin
    	return
    	(
    		select case when count(*) <= 3 then SYSDATETIME() else DATEADD(MINUTE, POWER(2, count(*) - 3), max(c1.instant)) end
    		from connection c1
    		where c1.[ip] = @ip
    		and c1.[status] = 0
    		and
    		(
    			c1.instant > (select max(c2.instant) from connection c2 where c2.[ip] = @ip and c2.[status] = 1)
    		 or not exists (select * from connection c2 where c2.[ip] = @ip and c2.[status] = 1)
    		)
    	);
    end;
    go

    J'ai deux questions en fait...

    Une première à propos des sous-requêtes :
    => N'y a-t-il pas moyen de se passer des sous-requête ? Le but étant, pour une IP donnée, de récupérer le nombre de tentatives erronées depuis la dernière réussite... (s'il y en a eu une)

    La seconde, à propos des index :
    => La colonne "status" est peut déterminante, puisqu'elle ne peut avoir que 2 valeurs. Elle n'a donc pas trop sa place dans un index. De plus, l'index va vite être fragmenté puisqu'on va avoir régulièrement des échecs. Ainsi, j'ai préféré faire des index filtrés pour avoir d'un côté les succès, et de l'autre les erreurs. Est-ce une ineptie ? Devrais-je préférer un unique index sur (ip, statut, instant) ?
    On ne jouit bien que de ce qu’on partage.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Possible, mais rare. Exemple : indexer en unique une colonne nullable

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. [XL-2010] Suppression des lignes ne contenant pas une suite de caractères
    Par bloodyjacquou dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 27/09/2016, 18h12
  2. Réponses: 3
    Dernier message: 08/03/2010, 13h36
  3. Des lignes compliquées pour pas grand chose
    Par Anduriel dans le forum Windows Forms
    Réponses: 1
    Dernier message: 30/10/2009, 14h25
  4. requette qui renvoi des ligne double
    Par fehmitn dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/09/2004, 22h36
  5. Réponses: 10
    Dernier message: 10/06/2004, 16h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo