Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 12 sur 12
  1. #1
    Futur Membre du Club
    Inscrit en
    mai 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 62
    Points : 18
    Points
    18

    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 émérite
    Homme Profil pro Serge RUQUET
    Consultant informatique
    Inscrit en
    août 2006
    Messages
    725
    Détails du profil
    Informations personnelles :
    Nom : Homme Serge RUQUET
    Âge : 52
    Localisation : France

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

    Informations forums :
    Inscription : août 2006
    Messages : 725
    Points : 888
    Points
    888

    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 :
    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
    Futur Membre du Club
    Inscrit en
    mai 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 62
    Points : 18
    Points
    18

    Par défaut

    Bonjour,

    Je vais essayer tout desuite...


    Alf

  4. #4
    Futur Membre du Club
    Inscrit en
    mai 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 62
    Points : 18
    Points
    18

    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 :
    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 émérite
    Homme Profil pro Serge RUQUET
    Consultant informatique
    Inscrit en
    août 2006
    Messages
    725
    Détails du profil
    Informations personnelles :
    Nom : Homme Serge RUQUET
    Âge : 52
    Localisation : France

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

    Informations forums :
    Inscription : août 2006
    Messages : 725
    Points : 888
    Points
    888

    Par défaut

    essayez cela, je ne sais plus ou mets le limit !!

    Code :
    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
    Futur Membre du Club
    Inscrit en
    mai 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 62
    Points : 18
    Points
    18

    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 :
    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 :
    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
    Futur Membre du Club
    Inscrit en
    mai 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 62
    Points : 18
    Points
    18

    Par défaut

    OK.

    Bon, je vais dans un premier temps me débrouiller avec ça :
    Code :
    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 émérite
    Homme Profil pro Serge RUQUET
    Consultant informatique
    Inscrit en
    août 2006
    Messages
    725
    Détails du profil
    Informations personnelles :
    Nom : Homme Serge RUQUET
    Âge : 52
    Localisation : France

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

    Informations forums :
    Inscription : août 2006
    Messages : 725
    Points : 888
    Points
    888

    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
    Futur Membre du Club
    Inscrit en
    mai 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 62
    Points : 18
    Points
    18

    Par défaut

    Merci pour ces précisions.

    Pour connecter mon serveur lié j'utilse ceci :
    Code :
    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 émérite
    Homme Profil pro Serge RUQUET
    Consultant informatique
    Inscrit en
    août 2006
    Messages
    725
    Détails du profil
    Informations personnelles :
    Nom : Homme Serge RUQUET
    Âge : 52
    Localisation : France

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

    Informations forums :
    Inscription : août 2006
    Messages : 725
    Points : 888
    Points
    888

    Par défaut

    dans SSms essaie d'exécuter

    Code :
    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
    Futur Membre du Club
    Inscrit en
    mai 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 62
    Points : 18
    Points
    18

    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 :
    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 émérite
    Homme Profil pro Serge RUQUET
    Consultant informatique
    Inscrit en
    août 2006
    Messages
    725
    Détails du profil
    Informations personnelles :
    Nom : Homme Serge RUQUET
    Âge : 52
    Localisation : France

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

    Informations forums :
    Inscription : août 2006
    Messages : 725
    Points : 888
    Points
    888

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •