sql >> Base de Datos >  >> RDS >> Sqlserver

Base de datos de SQL Server en recurso compartido UNC

AttachDbFileName es una característica terrible y engañosa. Lo que pasa es que cada aplicación que se conecta a esta "base de datos" hace una copia del archivo de datos. Así que si Machine1 se conecta y realiza cambios, esos cambios son invisibles para Machine2 . Esto causa mucha confusión incluso en un escenario de una sola máquina porque las personas se conectarán a través de Visual Studio, realizarán alguna actualización y luego no la verán desde Management Studio. O viceversa. La User Instance la función ha quedado obsoleta por una razón; deja de usar ambos.

Dado que desea que varias máquinas/aplicaciones se conecten al mismo copia de su base de datos, la solución que desea es tener una sola copia de la base de datos adjunta a una sola instancia de SQL Server, y ambas aplicaciones/máquinas simplemente se conectan a esa única copia.

En MACHINE1-PC haz esto:

  1. Mover ShopDatabase.mdf y su asociado .ldf archivo fuera de su carpeta de usuario y dentro de la carpeta de datos para su instancia. Esto será algo como:

  2. Conéctese a la instancia Express local usando .\SQLEXPRESS . Adjunte la base de datos usando el siguiente código:

    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. Determine la dirección IP externa de MACHINE1-PC (puede hacer esto a través de un ping desde otra máquina - localmente le dirá 127.0.0.1 que es inútil). Suponiendo que tiene una IP fija y no está usando DHCP, es probable que esta sea una forma más confiable de conectarse, o al menos le falta un paso adicional (resolver el nombre). Sin embargo, si usa DHCP, no querrá confiar en esto porque su dirección IP cambiará potencialmente con el tiempo. Su cadena de conexión ahora debería ser:

    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)
    

En Machine1 su cadena de conexión podría use Data Source=.\SQLEXPRESS , pero mejor ser coherente que ahorrarse un par de pulsaciones. De esta manera, si realiza otros cambios en su archivo de configuración, etc., se pueden distribuir a otras máquinas sin necesidad de cambiar el nombre de la máquina.