2011-01-21 21 views
5

he utilizado tsql separar una base de datos de la siguiente manera:Cómo cambiar el nombre de la base de datos física Archivos

EXEC sp_detach_db @dbname = 'my_db' 

que a continuación hizo uso de PHP para cambiar el nombre de los archivos físicos. ¡Pude cambiar el nombre del archivo mdf pero no el archivo ldf! ¡Incluso probé un comando dos REN pero eso tampoco funcionó para el archivo ldf!

Quería preguntar, ¿hay algo especial acerca de los archivos de registro físico que permiten que no se renombre?

¿Hay una mejor manera de hacerlo?

Gracias a todos

+0

La primera pregunta es ¿por qué estás tratando de hacer esto? – Lazarus

+0

Estoy tratando de hacer un nuevo nombre adecuado. No puedo crear una base de datos con el mismo nombre una vez que he separado una base de datos, ya que los nombres de los archivos físicos siguen siendo los mismos. – Abs

+0

Relacionados [Cambiar el nombre de una base de datos SQL] (http://stackoverflow.com/questions/4080430) –

Respuesta

7

Puede hacerlo mediante una declaración ALTER DATABASE - como esto:

ALTER DATABASE (your database) 
    MODIFY FILE (NAME = logical_file_name, 
       FILENAME = ' new_path/os_file_name ') 

tiene que modificar cada archivo por separado, por ejemplo, si tiene varios archivos de datos, debe modificar cada uno de ellos.

Para obtener más información, consulte el Technet documentation on this topic.

+0

Para que realmente funcione, tengo que mover manualmente el archivo o renombrarlo, ¿correcto? SQL Server no hará esto por mí y este es el bit que estoy tratando de automatizar. – Abs

+2

Exactamente, después de ejecutar el comando anterior necesita desconectar la base de datos, cambiar físicamente el nombre del archivo y volver a conectarlo en línea. – ulath

6

El comando "ALTER DATABASE (su base de datos) MODIFY FILE" solo cambiará el nombre de los nombres lógicos. Este post muestra cómo utilizar xp_cmdshell para cambiar el nombre también los archivos físicos: http://www.mssqltips.com/sqlservertip/1891/best-practice-for-renaming-a-sql-server-database/

Tenga en cuenta lo siguiente: 1.
xp_cmdshell se ejecuta bajo el usuario el que el proceso de SQL Server se ejecuta como, y podría no tener el sistema de archivos permisos necesarios para cambiar el nombre de los archivos de base de
2. Por razones de seguridad, no olvide desactivar xp_xmdshell

el siguiente es un ejemplo de cómo el cambio de nombre se puede hacer en base a la entrada en el blog mencionado. Reemplazará la base de datos MyDB con la base de datos NewMyDB. El MyDB original (renombrado a MyDB_OLD) quedará separado.

-- Enable xp_cmdshell: 
sp_configure 'show advanced options', 1 
RECONFIGURE WITH OVERRIDE 
GO 
sp_configure 'xp_cmdshell', 1 
RECONFIGURE WITH OVERRIDE 
GO 

-- Get physical file names: 
declare @MyDBOriginalFileName nvarchar(300) = (select physical_name FROM sys.master_files where name = 'MyDB') 
declare @MyDBLogOriginalFileName nvarchar(300) = (select physical_name FROM sys.master_files where name = 'MyDB_log') 
declare @NewMyDBOriginalFileName nvarchar(300) = (select physical_name FROM sys.master_files where name = 'NewMyDB') 
declare @NewMyDBLogOriginalFileName nvarchar(300) = (select physical_name FROM sys.master_files where name = 'NewMyDB_log') 
declare @Command nvarchar(500) 
declare @Sql nvarchar(2000) 

IF (EXISTS (select * from sys.databases where name = 'NewMyDB') 
AND EXISTS (select * from sys.databases where name = 'MyDB')) 
BEGIN 
    USE master 

    ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
    ALTER DATABASE NewMyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

     -- Set new database name 
     ALTER DATABASE MyDB MODIFY NAME = MyDB_OLD 
     ALTER DATABASE NewMyDB MODIFY NAME = MyDB 

     -- Update logical names 
     ALTER DATABASE MyDB_OLD MODIFY FILE (NAME=N'MyDB', NEWNAME=N'MyDB_OLD') 
     ALTER DATABASE [MyDB] MODIFY FILE (NAME=N'NewMyDB', NEWNAME=N'MyDB') 

     EXEC master.dbo.sp_detach_db @dbname = N'MyDB_Old' 
     EXEC master.dbo.sp_detach_db @dbname = N'MyDB' 

     -- Rename physical files 
     SET @Command = 'RENAME "' + @MyDBOriginalFileName + '" "MyDB_OLD.mdf"'; PRINT @Command 
     EXEC xp_cmdshell @Command 
     SET @Command = 'RENAME "' + @MyDBLogOriginalFileName + '" "MyDB_OLD_log.mdf"'; PRINT @Command 
     EXEC xp_cmdshell @Command 
     SET @Command = 'RENAME "' + @NewMyDBOriginalFileName + '" "MyDB.mdf"'; PRINT @Command 
     EXEC xp_cmdshell @Command 
     SET @Command = 'RENAME "' + @NewMyDBLogOriginalFileName + '" "MyDB_log.mdf"'; PRINT @Command 
     EXEC xp_cmdshell @Command 

     -- Attach with new file names 
     declare @NewMyDBFileNameAfterRename nvarchar(300) = replace(@NewMyDBOriginalFileName, 'NewMyDB', 'MyDB') 
     declare @NewMyDBLogFileNameAfterRename nvarchar(300) = replace(@NewMyDBOriginalFileName, 'NewMyDB_log', 'MyDB_log') 
     SET @Sql = 'CREATE DATABASE MyDB ON (FILENAME = ''' + @NewMyDBFileNameAfterRename + '''), (FILENAME = ''' + @NewMyDBLogFileNameAfterRename + ''') FOR ATTACH' 
     PRINT @Sql 
     EXEC (@Sql) 

    ALTER DATABASE MyDB SET MULTI_USER 

END 

-- Disable xp_cmdshell for security reasons: 
GO 
sp_configure 'show advanced options', 1 
RECONFIGURE WITH OVERRIDE 
GO 
sp_configure 'xp_cmdshell', 0 
RECONFIGURE WITH OVERRIDE 
GO 
+0

Por favor, extienda su respuesta con un extracto/resumen del enlace proporcionado. El enlace en sí no es la respuesta. Y también ... el enlace podría quedar obsoleto –

8

Separar la base de datos, renombrar los archivos, adjuntarla de nuevo.

+0

Mucho más fácil :-) – Rasmus

+0

Lo único es anotar la ruta y el nombre de archivo de los archivos .mdf, .ndf y .ldf asociados con su base de datos antes de realizar la operación de separación. Si tiene varias bases de datos que están creando sus datos, datos secundarios y archivos de registro en la misma ubicación de instalación predeterminada de SQL Server, es posible que se confunda más adelante al volver a conectar la base de datos. – RBT

+0

Puede usar la separación de GUI de SSM, usar el [explorador de Windows para cambiar el nombre de los archivos,] (http://stackoverflow.com/questions/4080430/change-the-name-of-a-sql-database/18324583#18324583) pero necesita usar [TSQL para volver a conectar] (https://msdn.microsoft.com/en-us/library/ms190209.aspx) –

1

La forma más sencilla de cambiar el nombre de SQL server physical database files es:

  1. abierto y conectar con el SQL server en la base de datos que quería cambiar el nombre se encuentra.
  2. Ejecute la siguiente secuencia de comandos en la ventana de consulta para cambiar los nombres físicos y lógicos. Recuerde reemplazar todo el "OldDatabaseName" con el nuevo nombre de la base de datos ("NewDatabaseName") al que desea cambiar su nombre.Reemplazar todo NewDatabaseName con el nuevo nombre que desea establecer para su base de datos

use OldDatabaseName

ALTER DATABASE OldDabaseName MODIFY FILE (NAME='OldDatabaseName', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\NewDatabaseName.mdf'); 

ALTER DATABASE OldDatabaseName MODIFY FILE (NAME='OldDatabaseName_log', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\NewDatabaseName_log.ldf'); 

ALTER DATABASE OldDatabaseName MODIFY FILE (NAME = OldDatabaseName, NEWNAME = NewDatabaseName); 
ALTER DATABASE OldDatabaseName MODIFY FILE (NAME = OldDatabaseName_log, NEWNAME = NewDatabaseName_log); 
  1. y haga clic en el OldDatabaseName, seleccione Tasks y luego elija Take Offline

  2. Vaya a la ubicación (C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\...) donde se encuentran los archivos físicos y cámbiele el nombre al NewDatabaseName que especificó en número 2. Recuerde verificar la ruta absoluta de estos archivos para usar en su computadora.
  3. Volver a Microsoft SQL Server Management Studio. Haga clic con el botón derecho en OldDatabaseName, seleccione Tasks y luego elija Bring Online.
  4. Por último, continúe y cambie el nombre de su OldDatabaseName al NewDatabaseName. Has terminado :-)
+0

También puede hacer 'ALTER DATABASE NewDatabaseName SET OFFLINE' y luego hacer el nombre de archivo cambia antes de hacer 'ALTER DATABASE NewDatabaseName SET ONLINE'. – cusman

Cuestiones relacionadas