2010-12-13 80 views
1

J'ai une base de données Access 2003 avec des tables liées à une base de données SQL Server 2005. Les informations utilisateur (le mot de passe) utilisées pour créer une connexion ODBC entre Access et SQL Server ont été récemment mises à jour. Lorsque j'ouvre la base de données Access et que j'essaie de modifier les informations de la table liée, je peux alors ouvrir les tables et voir mes données. Cependant, lorsque je ferme Access et rouvre la base de données Access, il apparaît que l'information de mot de passe a été rétablie et que j'obtiens une erreur de connexion ODBC.Modification des informations de table liée dans Access 2003

Quelqu'un sait-il ce que je fais de façon incorrecte? En guise de suivi, il semble que nous ayons environ une douzaine de bases de données Access avec de nombreuses tables liées qui ont toutes besoin de cette mise à jour. Est-ce la meilleure façon de mettre à jour cette information? Les tables liées semblent avoir été créées à l'aide de machines différentes car l'ID de poste de travail spécifié dans la connexion ODBC est différent.

+1

Avez-vous regardé le gestionnaire de tables lié? Il devrait y avoir une case à cocher "save password". Si ce n'est pas disponible, voir http://support.microsoft.com/?id=207823 – Fionnuala

+0

@Reemou, bonne idée, mais problème avec les tables liées qui sont liées à une vue. –

+0

Si vous n'avez pas beaucoup de tables, supprimez-les et reconnectez-les après avoir créé le DSN approprié. –

Répondre

0

Écrivez une routine qui met à jour la propriété Connect à partir de TableDef et enregistre la modification avec RefreshLink.

+0

En général, avec les tables liées ODBC, il est presque toujours préférable de supprimer et de recréer les tables liées, car cela garantit que toutes les métadonnées sont à jour. –

0

Le problème avec le gestionnaire de tables liées (LTM) est lorsque vous avez lié des tables qui sont en fait des liens vers des vues SQL. Dans ce cas, LTM reliera les "tables" sans les réattribuer au PK approprié, et elles ne pourront plus être mises à jour. J'ai écrit du code que j'avais l'habitude de démarrer à partir de VBE, c'est une chose rapide et sale, mais vous pourriez sûrement l'adapter si vous en avez besoin. Il y a 2 sous-marins, un pour les tables et un pour les requêtes passthru.

Option Compare Database 
option explicit 

Const kOld = "remote.g" 'string to identify old server 
'new server odbc string 
Const kConnLux = "ODBC;DRIVER=SQL Server Native Client 10.0;SERVER=xxxx;UID=yyyy;PWD=zzzz;" 

Sub UpdateTables() 
    Dim db As Database, td As TableDef 
    Dim hasIndex As Boolean, strSql As String 

    Set db = CurrentDb 
    For Each td In db.TableDefs 
     If InStr(1, td.Connect, kOld) > 0 Then 'lien vers CE serveur ? 
      If td.Name Like "dbo_vw*" And td.Indexes.count = 1 Then 'table = vue attachee --> pbl de clef primaire 
       strSql = "CREATE INDEX " & td.Indexes(0).Name & " ON [" & td.Name & "](" & td.Indexes(0).Fields & ")" 
       ' convert field list from (+fld1;+fld2) to (fld1,fld2) 
       strSql = Replace(strSql, "+", "") 
       strSql = Replace(strSql, ";", ",") 
       hasIndex = True 
      Else 
       hasIndex = False 
      End If 
      td.Connect = kConnLux 
      td.RefreshLink 
      Debug.Print td.Name 
      If hasIndex And td.Indexes.count = 0 Then 
       ' if index now removed then re-create it 
       CurrentDb.Execute strSql 
      End If 
     End If 
    Next td 
    Debug.Print "Done" 
End Sub 

Sub UpdateQueries() 
    Dim db As Database 
    Dim td As QueryDef 
    Set db = CurrentDb 
    For Each td In db.QueryDefs 
     If InStr(1, td.Connect, kOld) > 0 Then 
      td.Connect = kConnLux 
      Debug.Print td.Name, td.Connect 
     End If 
    Next td 
End Sub 
+0

Avec les tables liées ODBC, je n'actualise jamais les chaînes de connexion de TableDefs, mais les supprime et les recréer à partir de zéro, parce que vous êtes sûr que les métadonnées sont à jour (l'absence de mise à jour est la cause de non-actualisation des vues). –