Une appli Access devenue critique souffre dès qu’on l’ouvre via VPN : lenteurs extrêmes, blocages et corruption menacent la production. Ce guide explique comment corriger durablement — du split FE/BE à RDP/RDS, jusqu’à la migration vers SQL Server — avec scripts, check‑lists et bonnes pratiques.
Problématique
Une base Microsoft Access, conçue initialement comme outil « maison », est stockée sur un partage réseau et utilisée par une dizaine de personnes. Sur le LAN, elle reste acceptable ; via VPN, l’expérience se dégrade fortement : formulaires interminables à s’ouvrir, requêtes qui « figent », erreurs d’E/S, corruption potentielle.
- Accès fichier : Access est un moteur « fichier ». Chaque requête provoque de nombreux allers‑retours SMB. Avec une latence 10 à 100 fois supérieure au LAN, le coût de chattiness réseau explose.
- Fragilité aux micro‑coupures : la moindre interruption VPN en pleine écriture peut casser la cohérence du fichier et endommager la base.
Pourquoi Access s’effondre sur VPN
Access a été pensé pour des partages proches et stables. Sur VPN, trois facteurs se cumulent :
- Latence : une opération simple (ouvrir un formulaire lié) déclenche des centaines de lectures de pages. À 40–80 ms de RTT, l’attente s’accumule.
- Débit asymétrique : les sites distants ont souvent une bande passante montante limitée ; les enregistrements/joins volumineux saturent rapidement l’upload.
- Instabilité : les coupures brèves (perte de paquets, renégociation du tunnel) se traduisent par des erreurs de partage et des locks orphelins.
Mesurer l’ampleur avant d’agir
Un diagnostic rapide aide à choisir la voie de remédiation.
Mesure | Acceptable LAN | Typique VPN | Impact Access |
---|---|---|---|
Latence aller‑retour (ping) | ≤ 1–3 ms | 30–100 ms | Multiplication des délais d’E/S |
Débit utile | ≥ 100 MB/s (SMB local) | 2–20 MB/s | Listes volumineuses impraticables |
Jitter / micro‑coupures | Quasi nul | Présent | Risque de corruption en écriture |
Solutions proposées
Scinder la base (Front‑End / Back‑End)
Principe : placer formulaires, états, modules et requêtes dans un Front‑End (FE) local ; ne laisser sur le serveur que les tables (Back‑End, BE). Cette séparation réduit le trafic sur le LAN et clarifie la responsabilité des composants.
Limite : sur VPN, cela ne suffit pas ; on manipule toujours un fichier partagé via SMB. La scission est cependant un prérequis aux solutions durables ci‑dessous.
Pas à pas :
- Dupliquer la base et supprimer toutes les tables du FE ; lier celles du BE via ODBC/attaches Access.
- Activer le verrouillage au niveau enregistrement et les index sur les clés étrangères.
- Paramétrer les formulaires pour charger filtré (voir section Refonte).
- Automatiser la distribution du FE (script d’auto‑mise à jour au démarrage).
Abandonner l’accès direct par fichier sur VPN
Pour éliminer lenteur et corruption, cesser d’ouvrir le fichier Access à travers le VPN. Deux voies principales :
Bureau à distance / Services Bureau à distance (RDS)
- Idée : exécuter Access sur un serveur du LAN ; ne transporter que l’image/les frappes via RDP.
- Avantages : mise en œuvre rapide, peu de changements FE, excellente réactivité, risque de corruption nul (le fichier ne quitte pas le LAN).
- Points d’attention : licences RDS/CAL, dimensionnement CPU/RAM/IO du serveur, politiques GPO (imprimantes, redirections), profils itinérants.
Checklist de mise en service :
- Créer une collection de RemoteApp exposant un raccourci « Access – NomDeLAppli ».
- Stocker le FE en local sur le serveur RDS (ou par utilisateur via script de logon).
- Activer MFA/SSO côté VPN/AD ; limiter l’accès RDP par groupe AD dédié.
- Activer la redirection d’imprimantes PDF si nécessaire, désactiver le mappage disque sauvage.
Dimensionnement indicatif : pour une appli Access standard, compter ~1 vCPU / 6–10 sessions et 200–300 Mo RAM / session (à affiner par test de charge). Prévoir du SSD NVMe pour le stockage des profils/temp.
Migration du Back‑End vers un moteur client‑serveur
Remplacer le BE Access par SQL Server Express (gratuit) sur le site principal, ou par une base managée (Azure SQL / AWS RDS SQL Server). Access reste le FE et dialogue en ODBC ; seul transite le résultat des requêtes, pas des pages de fichier.
- Avantages : protocole orienté messages, tolérant à la latence ; transactions ACID ; sauvegardes, chiffrement, haute dispo possibles ; ouverture à Power BI et autres outils.
- Vigilances : revoir les requêtes (SQL natif/pass‑through), filtrages sévères, gestion des connexions ODBC DSN‑less, pagination côté serveur, formulaires continus optimisés.
Étapes de migration type
- Inventaire : tables (volumétrie, types), relations, contraintes, macros, modules VBA.
- Montée de schéma : création des tables SQL Server (types natifs,
IDENTITY
pour Autonumber,NVARCHAR
pour texte, clés/contraintes). - Transfert des données : import par lot, contrôle de cardinalités et des nulls.
- Re‑lien des tables : remplacer les attaches Access par des attaches ODBC vers SQL Server (DSN‑less recommandé).
- Requêtes : convertir les queries critiques en pass‑through ou en vues/procédures stockées.
- Tests : volume réel, charge simultanée, coupures simulées, reprise.
Quand préférer le cloud managé
- Uplink du site hébergeant SQL insuffisant ou instable.
- Besoins de disponibilité multi‑sites sans administration locale.
- Exigences de chiffrement, sauvegardes automatiques et montée en charge simplifiée.
Refonte et optimisation du Front‑End Access
Quel que soit le back‑end, une hygiène FE s’impose.
- Charger moins, plus tard : ouvrir les formulaires filtrés (par ID/état) ; désactiver l’auto‑chargement des sous‑formulaires jusqu’à ce qu’un enregistrement parent soit sélectionné.
- Éviter les formulaires liés sur de grosses tables pour la saisie : préférez un formulaire non lié qui appelle des procédures stockées (upsert) ou des requêtes paramétrées.
- Requêtes pass‑through : pousser le travail serveur (JOIN, agrégats, pagination) plutôt que de rapatrier des milliers de lignes.
- Index : indexer toutes les FK et colonnes de filtrage (
DateMaj
,Actif
, etc.). - Nettoyage : supprimer les tables liées non utilisées, compacter/réparer le FE, compiler le VBA, livrer en
.accde
. - Distribution : script d’auto‑mise à jour ; voir exemple ci‑dessous.
Comparatif de solutions (synthèse)
Contexte | Recommandation | Délai de mise en œuvre | Impacts FE | Évolutivité |
---|---|---|---|---|
Besoin de résultat immédiat, budget maîtrisé | RDP/RDS | Rapide | Faibles | Moyenne (scaler le serveur) |
Vision long terme, intégration BI/ETL | SQL Server (Express/Cloud) | Moyen | Moyens à forts | Élevée |
Usage mobile via navigateur | Front‑end web + SQL | Plus long | Refonte | Très élevée |
Informations complémentaires utiles
Thème | Conseils pratiques |
---|---|
Sécurité | Chiffrer le BE, activer TLS pour SQL Server (Encrypt=yes;TrustServerCertificate=no ), sauvegardes automatisées avec rétention et tests de restauration. |
Licences | SQL Server Express est gratuit ; les offres managées sont facturées à l’usage. Pour RDS, prévoir des CAL ou des licences utilisateur RDS. |
Taille & utilisateurs | Access + SQL Server Express tient aisément 10–15 utilisateurs simultanés ; au‑delà, envisager SQL Server Standard ou une base cloud. |
Transition | Prévoir un pilote, documenter les processus, plan de communication, sauvegarde de repli « J‑1 », et fenêtre de bascule. |
Expertise | Audit par un développeur Access/SQL : schéma, requêtes lourdes, VBA, verrouillages, index manquants. |
Feuille de route recommandée
- Audit rapide : cartographie des tables et dépendances, volumétrie, macros critiques.
- Choix de la solution : RDS si priorité au délai ; SQL Server si pérennité, reporting et ouverture vers d’autres outils.
- Migration / factorisation : BE vers SQL Server, adaptation du FE, distribution automatisée.
- Tests de charge et de résistance : latence simulée, micro‑coupures, concurrence, rollback.
- Formation et support : procédure de secours, sauvegardes vérifiées, monitoring.
Exemples concrets : scripts et modèles
Chaîne de connexion ODBC DSN‑less (SQL Server)
ODBC;Driver={ODBC Driver 17 for SQL Server};
Server=tcp:MONSERVEUR,1433;
Database=MaBase;
Encrypt=yes;TrustServerCertificate=no;
UID=appuser;PWD=motdepassefort;
Astuce : utilisez des comptes de service à droits minimaux et stockez les secrets hors code (table locale chiffrée, ou fournisseur de secrets côté RDS).
Relier/actualiser les tables vers SQL (VBA)
Public Sub RelinkODBC()
Dim db As DAO.Database, tdf As DAO.TableDef
Dim cnn As String
cnn = "ODBC;Driver={ODBC Driver 17 for SQL Server};" & _
"Server=tcp:MONSERVEUR,1433;Database=MaBase;" & _
"Encrypt=yes;TrustServerCertificate=no;" & _
"UID=appuser;PWD=********;"
Set db = CurrentDb
For Each tdf In db.TableDefs
If Left$(tdf.Name, 4) <> "MSys" Then
If Len(tdf.Connect) > 0 Then
tdf.Connect = cnn
On Error Resume Next
tdf.RefreshLink
If Err.Number <> 0 Then Debug.Print tdf.Name & " - " & Err.Description
On Error GoTo 0
End If
End If
Next tdf
End Sub
Requête pass‑through (lecture paginée)
SELECT TOP (200) c.Id, c.Nom, c.Ville, c.DateMaj
FROM dbo.Clients AS c
WHERE c.Actif = 1
AND c.DateMaj >= DATEADD(day, -7, SYSUTCDATETIME())
ORDER BY c.DateMaj DESC;
Évitez les SELECT *
; projetez seulement les colonnes utiles et indexez la colonne de filtrage (DateMaj
).
Vue SQL pour formulaires « légers »
CREATE VIEW dbo.vClientsLite AS
SELECT Id, Nom, Ville
FROM dbo.Clients
WHERE Actif = 1;
Procédure stockée d’enregistrement (upsert minimal)
CREATE PROCEDURE dbo.usp_SaveCommande
@Id INT,
@ClientId INT,
@TotalTTC DECIMAL(18,2),
@User NVARCHAR(128)
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS (SELECT 1 FROM dbo.Commandes WHERE Id = @Id)
UPDATE dbo.Commandes
SET ClientId = @ClientId, TotalTTC = @TotalTTC, ModifiePar = @User, ModifieLe = SYSUTCDATETIME()
WHERE Id = @Id;
ELSE
INSERT dbo.Commandes (Id, ClientId, TotalTTC, CreePar, CreeLe)
VALUES (@Id, @ClientId, @TotalTTC, @User, SYSUTCDATETIME());
END
Appel depuis Access (ADO via connexion projet)
Public Sub SaveCommandeAdo(ByVal Id As Long, ByVal ClientId As Long, ByVal Total As Currency)
Dim sql As String
sql = "EXEC dbo.usp_SaveCommande @Id=" & Id & ", @ClientId=" & ClientId & _
", @TotalTTC=" & Replace(CStr(Total), ",", ".") & ", @User='" & Environ$("USERNAME") & "'"
CurrentProject.Connection.Execute sql
End Sub
Auto‑mise à jour du Front‑End
Public Sub AutoUpdateFE()
Dim src As String, dst As String
src = "\\SERVEUR\Applis\MaApp\MaApp.accde"
dst = Environ$("LOCALAPPDATA") & "\MaApp\MaApp.accde"
If Dir$(dst) = "" Then MkDir Environ$("LOCALAPPDATA") & "\MaApp"
If Dir$(src) <> "" Then
If Dir$(dst) = "" Or FileDateTime(src) > FileDateTime(dst) Then
FileCopy src, dst
Shell """" & dst & """", vbNormalFocus
Application.Quit acQuitSaveNone
End If
End If
End Sub
Appelez AutoUpdateFE
au démarrage (AutoExec) pour garantir que tous les postes utilisent le même binaire.
Optimisations côté formulaires
- RecordsetType = Snapshot pour les listes de sélection, et Dynaset (Inconsistent Updates) uniquement où nécessaire.
- Limitez les sous‑formulaires : chargez‑les à la demande en définissant leur
SourceObject
après le choix d’un enregistrement parent. - Temporisez les formulaires continus : rafraîchissement périodique plutôt que l’événement « After Update » de chaque ligne.
- Évitez les requêtes totales sur de grandes tables ; calculez les agrégats côté SQL dans des vues.
Plan de tests de charge et de résilience
- Jeu d’essai : cloner la base de prod (anonymisée si besoin) pour reproduire la volumétrie.
- Scénarios : ouverture du formulaire maître, saisie de 50 enregistrements, recherche avec 3 filtres, génération de 20 états en parallèle.
- Résilience : simuler des coupures (désactiver/re‑activer l’interface réseau) ; vérifier la reprise côté RDP/SQL.
- Critères d’acceptation : pages sous 2 s pour actions fréquentes, < 5 s pour états standards, zéro corruption.
Sécurité et sauvegardes : check‑list
- SQL : chiffrement TLS, comptes dédiés, rôles minimaux, journalisation, sauvegardes Full + Diff, plan de restauration testé.
- RDS : MFA, restriction réseau, GPO verrouillées, profils utilisateurs rangés, disque système et données sur SSD.
- Access : livrer en
.accde
, signer les macros/VBA, activer le Centre de gestion de la confidentialité.
Erreurs fréquentes et remèdes
Symptôme | Cause probable | Correctif |
---|---|---|
Formulaire met 30 s à s’ouvrir sur VPN | Formulaire lié sans filtre | Ouvrir filtré par ID/état, vue SQL « lite », TOP/pagination |
Corruption sporadique | Écriture interrompue (coupure VPN) | Basculer vers RDP ou SQL Server (fin de l’accès fichier) |
Verrouillages en chaîne | Absence d’index FK, formulaires mal configurés | Indexer FK, Record Locks: Edited Record, éviter les mises à jour massives |
Impression lente via VPN | Flux graphiques lourds | Utiliser RDP avec RemoteApp et imprimante locale redirigée |
Alternatives web (B/S)
Si l’équipe voyage souvent et vise un accès navigateur :
- Front‑end web léger (ASP.NET/React/etc.) consommant SQL Server : portabilité totale, mais refonte.
- Access FE + webservice : formulaires Access appelant des API REST (XMLHTTP), utile pour scénarios ciblés.
Mini‑glossaire
- FE/BE : Front‑End / Back‑End.
- RDP/RDS : protocole Bureau à distance / rôle Windows permettant des sessions applicatives.
- ODBC DSN‑less : chaîne de connexion ODBC sans DSN système, stockée dans l’application.
- Pass‑through : requête Access envoyée telle quelle au serveur SQL, non interprétée localement.
Conclusion
Le couple Access + partage réseau n’est pas conçu pour les liaisons VPN. Pour retrouver des performances et éliminer la corruption : (1) exécuter Access côté LAN via RDP/RDS lorsque la priorité est la mise en service rapide, ou (2) migrer le Back‑End vers SQL Server pour une base solide, évolutive et ouverte. Dans tous les cas, accompagnez par une refonte FE (requêtes pass‑through, chargements filtrés, distribution automatisée) et par une hygiène d’exploitation (sauvegardes, sécurité, monitoring). Vous obtiendrez une application réactive sur site et à distance, et un socle prêt pour le reporting, la mobilité et les futures intégrations.