The "ALTER DATABASE (your database) MODIFY FILE" command will only rename the logical names. This post shows how to use xp_cmdshell to rename physical files: http://www.mssqltips.com/sqlservertip/1891/best-practice-for-renaming-a-sql-server-database/
Please note the following:
1. xp_cmdshell will run as a user who is running SQL Server, and may not have the file system permissions required to rename database files
2. For security reasons, be sure to disable xp_xmdshell
The following is an example of how you can rename based on the mentioned blog post. It will replace the MyDB database with the NewMyDB database. The original MyDB (renamed MyDB_OLD) will be left disconnected.
-- 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
sverrehundeide
source share