Adressage dynamique du serveur SQL

0000002362     -      21/09/2018

Mercator permet un adressage dynamique du serveur SQL. Cela signifie que la façon d'atteindre le serveur peut varier selon des conditions fixées lors de l'installation de Mercator. Cela permet un adressage plus souple qu'en le faisant par une simple résolution DNS.

Exemple :

  • les utilisateurs dans le réseau local de l'entreprise vont adresser le serveur SQL par son adresse IP locale
  • les utilisateurs nomades qui se connectent via un VPN vont adresser le serveur SQL par cette même adresse IP locale ou via une autre
  • les utilisateurs distants dans une implantation disposant d'une adresse IP fixe (permettant donc la sécurisation du serveur SQL) vont adresser le serveur SQL directement par son adresse IP publique, sans passer par aucun VPN.

Pour utiliser cette fonctionnalité, il faut

  • disposer d'un code 8.5 ou ultérieur
  • être en configuration Majuro
  • disposer d'un Mercator mis à jour, dont la version de MercatorTunnel.dll est égale ou supérieure 8.4.55
  • disposer d'un MercatorShield mis à jour, dont la version de MercatorShield.exe est égale ou supérieure 2.0.7.40 et celle de MercatorShieldGui.exe à 2.0.10.40
  • avoir au préalable configuré MercatorShield en mode SQL cloud
  • après installation, il faudra redemander un nouveau certificat pour MercatorShield

Le paramétrage de cette fonctionnalité consiste essentiellement en l'écriture d'une classe qui doit surclasser MercatorApi.DynamicSqlServerConnector, contenue dans MercatorTunnel.dll. Dans cette programmation, il faut surcharger la méthode GetServer qui doit renvoyer une chaîne de caractères contenant le nom ou l'adresse du serveur SQL. L'exemple ci-dessous illustre cette situation : l'adresse du serveur SQL est toujours 192.168.2.110, sauf si les utilisateurs sont sur un site distant, reconnu par l'utilisation du range d'adresses ip locales 192.168.32.0. Dans ce dernier cas, le serveur SQL est adressé selon sql.test.com.

Zoom
using System;
using System.Collections.Generic;
using MercatorApi;
using System.Text;
using System.Net.NetworkInformation;

namespace MyDynamicSqlServerConnector
{
    public class MyDynamicSqlServerConnector : DynamicSqlServerConnector
    {

        public override string GetServer(MercatorSqlConnection.DynamicSqlServerContext context)
        {
            foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (ni.OperationalStatus == OperationalStatus.Up)
                {
                    foreach (UnicastIPAddressInformation x in ni.GetIPProperties().UnicastAddresses)
                    {
                        if ((x.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                        && (x.Address.ToString().StartsWith("192.168.32.")))
                                return "sql.test.com";
                    }
                }
            }
            return "192.168.2.110";
        }
    }
 

L'assembly contenant cette classe devra être placée

  • au niveau de Mercator
    • dans le répertoire principal
    • ou dans le répertoire des resources locales, si les resources sont installées localement
  • au niveau de MercatorShield : dans le répertoire contenant MercatorShieldGui.exe

Ensuite, il faudra modifier le fichier Mercator.connection et mettre en tant que SqlServer la valeur composée comme suit :

Possibilité 1

  • nom de l'assembly (terminant par .dll)
  • double points
  • espace de nom contenant la classe
  • double points
  • nom de la classe

Exemple :

MyDynamicSqlServerConnector.dll:MyDynamicSqlServerConnector:MyDynamicSqlServerConnector

Possibilité 2

  • nom de l'assembly (terminant par .dll)
  • double points
  • espace de nom contenant la classe
  • double points
  • nom de la classe
  • point d'interrogation
  • nom ou adresse du serveur si exception

Exemple :

MyDynamicSqlServerConnector.dll:MyDynamicSqlServerConnector:MyDynamicSqlServerConnector?192.168.2.110

Dans ce dernier cas, si l'instanciation de l'assembly ou l'exécution de la méthode GetServer produit une exception, alors le serveur SQL indiqué après le ? sera pris en compte.

 

Remarques :

  • Mercator empêchera qu'on adresse différents serveurs SQL. L'objectif ici est d'atteindre le même serveur SQL selon différents adressages.
  • Pour des raisons de performance, la méthode GetServer n'est pas exécutée à chaque connexion SQL, mais uniquement lors de la première connexion. Ensuite, la valeur renvoyée est maintenue en cache.