Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Base de données SQL Server sur partage UNC

AttachDbFileName est une caractéristique terrible et trompeuse. Ce qui se passe, c'est que chaque application qui se connecte à cette "base de données" fait une copie du fichier de données. Donc si Machine1 se connecte et apporte des modifications, ces modifications sont invisibles pour Machine2 . Cela provoque beaucoup de confusion, même dans un scénario à une seule machine, car les utilisateurs se connecteront via Visual Studio, effectueront des mises à jour, puis ne les verront pas depuis Management Studio. Ou vice versa. L'User Instance la fonctionnalité est obsolète pour une raison; veuillez cesser d'utiliser les deux.

Puisque vous voulez que plusieurs machines/applications se connectent au même copie de votre base de données, la solution que vous souhaitez est d'avoir une seule copie de la base de données attachée à une seule instance de SQL Server, et les deux applications/machines se connectent simplement à cette seule copie.

Sur MACHINE1-PC faites ceci :

  1. Déplacer ShopDatabase.mdf et son .ldf associé fichier hors de votre dossier utilisateur et dans le dossier de données de votre instance. Ce sera quelque chose comme :

  2. Connectez-vous à l'instance Express locale à l'aide de .\SQLEXPRESS . Joindre la base de données en utilisant le code suivant :

    CREATE DATABASE ShopDatabase 
      ON (FILENAME = 'C:\...\ShopDatabase.mdf'), 
      -------------------^^^ fill this in
         (FILENAME = 'C:\...\ShopDatabase_Log.ldf') 
      -------------------^^^ fill this in
    FOR ATTACH;
    
    -- if there is no log file, you may need to do:
    
    CREATE DATABASE ShopDatabase 
      ON (FILENAME = 'C:\...\ShopDatabase.mdf') 
      -------------------^^^ fill this in
    FOR ATTACH_REBUILD_LOG;
    
  3. Déterminez l'adresse IP externe de MACHINE1-PC (vous pouvez le faire via ping depuis une autre machine - localement, il vous dira 127.0.0.1 qui ne sert à rien). En supposant que vous ayez une adresse IP fixe et que vous n'utilisiez pas DHCP, ce sera probablement un moyen plus fiable de vous connecter, ou du moins il manque une étape supplémentaire (résolution du nom). Si vous utilisez DHCP, vous ne voudrez pas vous y fier car votre adresse IP changera potentiellement avec le temps. Votre chaîne de connexion devrait maintenant être :

    Data Source=MACHINE1-PC\SQLEXPRESS;
      Network=DBMSSOCN;
      Integrated Security=True;
      Initial Catalog=ShopDatabase;
    
    -- or:
    
    Data Source=<<IP Address>>\SQLEXPRESS;
      Network=DBMSSOCN;
      Integrated Security=True;
      Initial Catalog=ShopDatabase;
    
    -- (replace <<IP Address>> of course)
    

Sur Machine1 votre chaîne de connexion pourrait utilisez Data Source=.\SQLEXPRESS , mais il vaut mieux être cohérent que d'économiser quelques frappes. De cette façon, si vous apportez d'autres modifications à votre fichier de configuration, etc., elles peuvent être distribuées à d'autres machines sans avoir à changer le nom de la machine.