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 :

Requête/fonction qui test si un serveur est lié


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 88
    Points : 48
    Points
    48
    Par défaut Requête/fonction qui test si un serveur est lié
    Bonjour,

    Quelqu'un pourrait-il me donner une requête SQL qui renvoie 1 si la connexion à un serveur lié (MySQL) existe et est valide et qui renvoie 0 dans les cas contraires ?
    Cela peut aussi être une fonction dans laquelle on passe en paramètre le nom du serveur lié à tester.
    Merci à vous.

    Alf

  2. #2
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    1- créé un alias a ton serveur lié (dans Services => sql agent) ou relevève l'IP du serveur MYSQL
    2- dans SSMS créé une proc sur ton serveur local du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE PROCEDURE ACCESS_MYSQL
    (@resultat int output)
    AS
    BEGIN
    set @resultat=1;
    BEGIN TRY
    select top 1 * from [nom_alias_du_serveur_mysql].mabasemysql.matablemysql
    --ou 
    select top 1 * from [IP_du_serveur_mysql].mabasemysql.matablemysql
    END TRY
    BEGIN CATCH
    SET @resultat=0
    END CATCH
    END
    PS: pense a prendre une table du serveur mysql qui sera toujours accessible
    Errare humanum est, perseverare diabolicum (Sénèque)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 88
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    Je vais essayer tout desuite...


    Alf

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 88
    Points : 48
    Points
    48
    Par défaut
    Je viens d'essayer...

    Si j'utilise la syntaxe des SELECT telle que mentionnée, j'ai l'erreur : objet non valide.
    Si j'utilise la syntaxe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select top 1 * from OPENQUERY(TEST, 'select * from SOCIETE')
    ça fonctionne
    Mais la procédure renvoie le résultat du select pas la valeur 0 ou 1.

    Je vais essayer de mettre ça sous forme de fonction pour passer en parametre le serveur, la base et la table, mais ma première tentative n'a pas fonctionner.

    Si vous pouviez me donner des pistes, je vous en serais reconnaissant.
    Merci.

    Alf

  5. #5
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    essayez cela, je ne sais plus ou mets le limit !!

    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
    CREATE PROCEDURE ACCESS_MYSQL
    (@resultat int output)
    AS
    BEGIN
    set @resultat=0;
    BEGIN TRY
    IF EXISTS(
    SELECT top 1 * FROM OPENQUERY(TEST, 'select 1 from SOCIETE LIMIT 1')
    )
    set @resultat=1;
     
    END TRY
    BEGIN CATCH
    SET @resultat=0
    END CATCH
    END
    Errare humanum est, perseverare diabolicum (Sénèque)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 88
    Points : 48
    Points
    48
    Par défaut
    Après d'autres test, la procédure proposée par Serge (merci à toi, ça me donne des pistes et des idées) et aménagé par moi avec le OPENQUERY, ne fonctionne pas. en effet si le serveur n'existe pas j'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg*7202, Niveau*11, État*2, Procédure*ACCESS_MYSQL, Ligne*8
    Impossible de trouver le serveur 'TEST' dans sysservers. Vérifiez que le nom du serveur correct a été spécifié. Si nécessaire, exécutez la procédure stockée sp_addlinkedserver pour ajouter ce serveur à sysservers.
    Je peux aussi obtenir une l'erreur suivante si le serveur lié existe mais erreur dans son paramétrage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    le fournisseur OLE DB "MSDASQL" du serveur lié "TEST" a retourné le message "[MySQL][ODBC 5.2(w) Driver]Access denied for user 'jrx'@'mail.domain.fr' (using password: YES)".
    Msg*7303, Niveau*16, État*1, Procédure*ACCESS_MYSQL, Ligne*8
    Impossible d'initialiser l'objet de la source de données du fournisseur OLE DB "MSDASQL" du serveur lié "TEST".
    Comment gère-t-on se type d'erreur ? pour que ça ne fasse pas planter l'application dans laquelle va être inséré la procédure.

    comment pourrais-je faire pour passer en paramètre le nom du serveur lié ainsi que la table et le champ car apparament avec le OPENQUERY ça n'a pas l'air possible...


    Alf

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 88
    Points : 48
    Points
    48
    Par défaut
    OK.

    Bon, je vais dans un premier temps me débrouiller avec ça :
    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
     
    CREATE PROCEDURE ACCESS_MYSQL
    (@Serveur Varchar(15), @resultat int output)
    AS
    BEGIN
    	set @resultat=1
    	BEGIN TRY
    	    EXEC sp_testlinkedserver @Serveur
    	END TRY
    	BEGIN CATCH
    		SET @resultat=0
    	END CATCH
    END
    GO
     
    DECLARE @result as int
    EXEC ACCESS_MYSQL 'TEST', @result OUTPUT
    SELECT @result
    L'autre étape sera de faire fonctionner le paramètre @Serveur
    si dans le code de la procédure je remplace @Serveur par TEST tout marche.

    Quelqu'un à une idée ?


    Alf

  8. #8
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    je pense que ton problème vient du serveur linké et pas de la proc

    dans l'onglet où tu définis le serveur linked mysql tu as un onglet paramètres avancés ou quelque chose comme cela

    dedans il te faut dire de se connecter avec un compte qui a les droits, c'est le choix le plus bas dans l'onglet

    ensuite, valide et click droit sur le serveur linké dans l'arborescence => tester connection

    si cela fonctionne, la proc fonctionnera;

    PS: il se peut qu'il faille rajouter une option dans le provider mysql comme pour Oracle où il faut cocher le "Allow null...", le spécialiste est Elsuquet, il a fait un article la dessus

    sorry, je suis linux/sybase aujourd'hui donc pas sql serveur sous la main
    Errare humanum est, perseverare diabolicum (Sénèque)

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 88
    Points : 48
    Points
    48
    Par défaut
    Merci pour ces précisions.

    Pour connecter mon serveur lié j'utilse ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    EXEC master.dbo.sp_addlinkedserver 
    @server = N'TEST', 
    @srvproduct=N'MySQL', 
    @provider=N'MSDASQL',
    @provstr=N'DRIVER={MySQL ODBC 5.2w Driver}; DSN={TEST}; SERVER=@ip; DATABASE=DataTest; USER=jrx; PASSWORD=******; OPTION=0'
    et avec le code donné ci-dessus, tout fonctionne bien quand je remplace @Serveur par le nom du serveur ici TEST.
    Ce que je n'arrive pas à faire fonctionner c'est de passer à la procédure le nom du serveur en parametre. Je vais essayer aujourd'hui.

    Alf

  10. #10
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    dans SSms essaie d'exécuter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from TEST..nimportequoi
    si c'est un problème de link il va te renvoyer un message du type "provider blabla...

    si c'est un problème de droit il te renverra une erreur "impossible de se connecter au server...

    s'il arrive a se connecter au serveur mais qu'il n'accède pas à la base il te renverra "login failed...
    Errare humanum est, perseverare diabolicum (Sénèque)

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 88
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    J'espère que vous avez passé un bon Noël, de bonnes vacances et je vous souhaite déjà un bon réveillon pour la nouvelle année qui vient.

    J'ai résolu mon pb en utilisant le code de mon précédant poste et ce code-ci :
    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
    22
    23
    24
     
    IF EXISTS (SELECT * 
    	   FROM   sysobjects 
    	   WHERE  name = 'TEST_ACCESS_SERVEUR_LIE')
        DROP PROCEDURE TEST_ACCESS_SERVEUR_LIE
    GO
     
    CREATE PROCEDURE TEST_ACCESS_SERVEUR_LIE
    (@NomServeur sysname, @resultat int output)
    AS
    BEGIN
    	set @resultat=1
    	BEGIN TRY
    		EXEC sp_testlinkedserver @NomServeur
    	END TRY
    	BEGIN CATCH
    		SET @resultat=0
    	END CATCH
    END
    GO
     
    DECLARE @result as int
    EXEC TEST_ACCESS_SERVEUR_LIE TEST, @result OUTPUT
    SELECT @result

  12. #12
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    Merci,

    peux tu mettre le tag résolu stp
    Errare humanum est, perseverare diabolicum (Sénèque)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction qui teste la longueur du plus long mot d'une chaine
    Par identifiant_bidon dans le forum Langage
    Réponses: 3
    Dernier message: 30/10/2008, 11h03
  2. fonction qui vérifie si une valeur est numérique?
    Par ryadh.naouar dans le forum C
    Réponses: 16
    Dernier message: 05/07/2007, 17h33
  3. fonction qui indique qu'une variable est d'un type entier
    Par piotrr dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 21/06/2007, 16h05
  4. Réponses: 1
    Dernier message: 16/06/2007, 21h44
  5. fonction qui fait crasher le serveur ?
    Par hannibal69 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 19/04/2007, 16h00

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