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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 88
    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
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    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

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

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

    Je vais essayer tout desuite...


    Alf

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 88
    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 émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    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

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 88
    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 confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 88
    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

+ 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