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

MS SQL Server Discussion :

stockage variable avec sql


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2013
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 164
    Points : 53
    Points
    53
    Par défaut stockage variable avec sql
    Bonjour, j'ai deux questions,

    la première : comment peut-on stocker des variables avec le langage sql ? J'utilise SQL server et concrètement j'aimerais faire quelque chose comme la requête ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT     date_der_modif_mdp, login, DATEDIFF([day], date_der_modif_mdp, { fn NOW() }) AS [nombre de jours], CASE DATEDIFF([day], date_der_modif_mdp,
                          { fn NOW() }) WHEN 33 THEN "on stocke le code d'accès dans une variable" ELSE "on ne fait rien" END AS result
    FROM         Table A

    et ensuite est il possible d'utiliser la variable qui stockerait le code d'accès dans un update avec une syntaxe comme celle ci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE    Table A
    SET              code_acces = ' ' and code_acces "ne doit pas être égale à la valeur de la variable contenant le dernier code d'acces du user"
    WHERE     (DATEDIFF([day], date_der_modif_mdp, { fn NOW() }) = 33)
    Je ne sais pas si je suis très clair, en gros j'ai réussi à faire un traitement visant à effacer le mdp d'un user si son mdp a plus de 33 jours, mais j'aimerais avec ça un contrôle qui permette qu'il ne ressaisisse pas le même mdp ...

  2. #2
    Membre actif
    Avatar de SQL_EVAN
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2011
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 161
    Points : 245
    Points
    245
    Par défaut
    Bonjour,

    Regardez ce lien

    Formez-vous en peu sur le langage SQL ici

    Ensuite j'ai écrit votre SQL dans un format qui est accepté par le moteur SQL Server. Attention, je ne comprends pas le besoin fonctionnel donc ce n'est peut-être pas du tout ce que vous voulez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE @code_acces varchar(50)
     
    SELECT
    	@code_acces = (CASE
    		WHEN DATEDIFF([day], date_der_modif_mdp,
    		GETDATE()) = 33 THEN code_acces
    	END)
    FROM [TABLE_A]
     
     
    UPDATE [TABLE_A]
    SET code_acces = ' '
    WHERE DATEDIFF([day], date_der_modif_mdp, GETDATE()) = 33
    AND code_acces <> @code_acces

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2013
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 164
    Points : 53
    Points
    53
    Par défaut
    Merci beaucoup SQL_EVAN, cela m'a l'air très bien, par contre à ce niveau là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @code_acces = (CASE
    		WHEN DATEDIFF([day], date_der_modif_mdp,
    		GETDATE()) = 33 THEN code_acces
    	END)
    est ce que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @code_acces = (CASE [...]
    ne veut pas dire la meme chose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [...]GETDATE()) = 33 THEN code_acces [...]
    ??

  4. #4
    Membre actif
    Avatar de SQL_EVAN
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2011
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 161
    Points : 245
    Points
    245
    Par défaut
    Non, ce qu'on fait la et d'assigner la valeur de code_acces en base à notre variable.

    En réalité cette requête ne marchera pas puisque il y aura plus qu'un résultat pour code_acces. Il faudra donc passer par une curseur ou les stocker d'abords dans une table temporaire.

  5. #5
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2013
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 164
    Points : 53
    Points
    53
    Par défaut
    Sinon le code ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE [TABLE_A]
    SET code_acces = ' '
    WHERE DATEDIFF([day], date_der_modif_mdp, GETDATE()) = 33
    AND code_acces <> @code_acces
    ne fonctionne pas, à cause de la dernière ligne car pour le systeme code_acces est toujours égale au contenu de la variable @code_acces ; il faudrait pouvoir isoler la saisie d'un nouveau mdp, et comparer cette saisie avec la variable et là ça le ferait ... mais par contre je n'ai aucune idée de comment m'y prendre

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 848
    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 848
    Points : 52 966
    Points
    52 966
    Billets dans le blog
    6
    Par défaut
    Vous pouvez utiliser la clause OUTPUT pour ce faire....

    A +

  7. #7
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2013
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 164
    Points : 53
    Points
    53
    Par défaut
    ok merci je vois ça

  8. #8
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Quid du code suivant ?

    Code : 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
    CREATE PROCEDURE usp_mot_de_passe_changer
    	@_login varchar(30) -- A mettre en conformité avec la colonne qui le stocke
    	, @_nouveau_mdp varchar(30) -- A mettre en conformité avec la colonne qui le stocke
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	DECLARE @code_acces varchar(30) -- A mettre en conformité avec la colonne qui le stocke
     
    	SELECT	@code_acces = CASE DATEDIFF(day, date_der_modif_mdp, GETDATE() WHEN 33 THEN code_acces END
    	FROM	dbo.TABLE_A
    	WHERE	[login] = @_login
     
    	IF @code_acces <> @_nouveau_mdp
    	BEGIN
    		UPDATE	dbo.Table_A
    		SET	code_access = @_nouveau_mdp
    			, date_der_modif_mdp = GETDATE()
    		WHERE	login = @_login
    	END
    END
    Ou est-ce que vous cherchez à faire la même chose mais pour tous les codes d'accès à la fois ?

    @++

  9. #9
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2013
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 164
    Points : 53
    Points
    53
    Par défaut
    Bonjour elsuket,

    désolé de la réponse tardive, j'étais en vacances, donc en fait pour que le user ne saisisse pas de mdp identique à son ancien, j'ai eu recours à un check directement après avoir créé une colonne ancien_mdp. Mon code, qui est celui ci, fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TRIGGER [controlemdp] ON [TableA].[identification]
    FOR UPDATE
    AS
    DECLARE @code_acces varchar(50)
    SELECT
        @code_acces = (SELECT code_acces FROM TableA.identification WHERE
    DATEDIFF ([day], date_der_modif_mdp, { fn NOW() })= 33)
    UPDATE    TableA.identification
    SET code_acces = ' ', ancien_code_acces = @code_acces
    WHERE     (DATEDIFF([day], date_der_modif_mdp, { fn NOW() }) = 33)
    mais cela ne fonctionne que pour un seul user dont le mdp est "périmé" depuis 33jours, s'il y en a plusieurs de concernés, ça plante, et à raison car il faut que j'insère une boucle dans mon code.
    Je pensais à une boucle while, donc j'essaie de me débrouiller avec ça.

  10. #10
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Effectivement, votre déclencheur n'étant pas ensembliste, cela ne peut pas fonctionner. Regardez le billet que j'ai écrit sur le sujet

    D'autre part l'utilisation de fonctions scalaires est à prescrire, puisque ... elles ne sont pas exécutées de façon ensembliste : elles sont appelées une fois par ligne de résultat. Je ne serais pas surpris que cette fonction retourne tout simplement GETDATE(); si tel est le cas, mettez GETDATE() directement dans le code de votre trigger ensembliste

    @++

  11. #11
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2013
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 164
    Points : 53
    Points
    53
    Par défaut
    Merci Elsuket, je vais lire votre article

Discussions similaires

  1. Création de variable avec SQL
    Par valesole dans le forum Débutez
    Réponses: 2
    Dernier message: 22/07/2013, 16h45
  2. Utiliser les macro variables avec sql
    Par Euseibus dans le forum Macro
    Réponses: 5
    Dernier message: 25/10/2007, 18h40
  3. Problème de variables avec SQL
    Par sabchris dans le forum SQL
    Réponses: 2
    Dernier message: 01/10/2007, 10h10
  4. Réponses: 1
    Dernier message: 14/04/2006, 11h02
  5. [MySQL] Encore un probleme de variables avec les requetes sql
    Par eown dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/04/2006, 11h01

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