Précédent   Forum du club des développeurs et IT Pro > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 17/12/2012, 10h59   #1
bong03
Futur Membre du Club
 
Inscription : mai 2006
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 61
Points : 15
Points : 15
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
bong03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 10h15   #2
serge0934
Membre émérite
 
Homme Serge RUQUET
Consultant informatique
Inscription : août 2006
Messages : 715
Détails du profil
Informations personnelles :
Nom : Homme Serge RUQUET
Âge : 51
Localisation : France

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

Informations forums :
Inscription : août 2006
Messages : 715
Points : 912
Points : 912
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)
serge0934 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 16h16   #3
bong03
Futur Membre du Club
 
Inscription : mai 2006
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 61
Points : 15
Points : 15
Bonjour,

Je vais essayer tout desuite...


Alf
bong03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 16h33   #4
bong03
Futur Membre du Club
 
Inscription : mai 2006
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 61
Points : 15
Points : 15
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
bong03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 17h10   #5
serge0934
Membre émérite
 
Homme Serge RUQUET
Consultant informatique
Inscription : août 2006
Messages : 715
Détails du profil
Informations personnelles :
Nom : Homme Serge RUQUET
Âge : 51
Localisation : France

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

Informations forums :
Inscription : août 2006
Messages : 715
Points : 912
Points : 912
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)
serge0934 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 17h41   #6
bong03
Futur Membre du Club
 
Inscription : mai 2006
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 61
Points : 15
Points : 15
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
bong03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 17h53   #7
bong03
Futur Membre du Club
 
Inscription : mai 2006
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 61
Points : 15
Points : 15
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
bong03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 19h01   #8
serge0934
Membre émérite
 
Homme Serge RUQUET
Consultant informatique
Inscription : août 2006
Messages : 715
Détails du profil
Informations personnelles :
Nom : Homme Serge RUQUET
Âge : 51
Localisation : France

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

Informations forums :
Inscription : août 2006
Messages : 715
Points : 912
Points : 912
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)
serge0934 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 09h17   #9
bong03
Futur Membre du Club
 
Inscription : mai 2006
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 61
Points : 15
Points : 15
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
bong03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 09h34   #10
serge0934
Membre émérite
 
Homme Serge RUQUET
Consultant informatique
Inscription : août 2006
Messages : 715
Détails du profil
Informations personnelles :
Nom : Homme Serge RUQUET
Âge : 51
Localisation : France

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

Informations forums :
Inscription : août 2006
Messages : 715
Points : 912
Points : 912
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)
serge0934 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 15h02   #11
bong03
Futur Membre du Club
 
Inscription : mai 2006
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 61
Points : 15
Points : 15
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
bong03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 17h18   #12
serge0934
Membre émérite
 
Homme Serge RUQUET
Consultant informatique
Inscription : août 2006
Messages : 715
Détails du profil
Informations personnelles :
Nom : Homme Serge RUQUET
Âge : 51
Localisation : France

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

Informations forums :
Inscription : août 2006
Messages : 715
Points : 912
Points : 912
Merci,

peux tu mettre le tag résolu stp
__________________
Errare humanum est, perseverare diabolicum (Sénèque)
serge0934 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h23.


 
 
 
 
Partenaires

Hébergement Web