Попытка прикрепить mdf-файл к localDb выдает ошибку. Требуется хотя бы один файл.
НАЗВАНИЕ: Microsoft SQL Server Management Studio
Ошибка подключения базы данных для сервера '(localdb)\mssqllocaldb'. (Microsoft.SqlServer.Smo)
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
По крайней мере один файл необходим для присоединения базы данных. (Microsoft.SqlServer.Smo)
Я пытаюсь прикрепить это .mdf
файл базы данных в мой экземпляр LocalDb. Хорошо, если я смогу сделать это с SQL Server тоже. я имею .ldf
файл в том же каталоге
4 ответа
Ради завершения - комментарий Джима решает (наполовину) проблему и заставляет вас двигаться дальше.
Другая "половина" проблемы - что, если вы в конечном итоге захотите переименовать физический файл базы данных? Ответ доступен в этом посте CodeProject.
шаги:
ALTER DATABASE
установить новые физические имена файлов (файл данных и файл журнала)
Не вступит в силу, пока SQL Server не будет перезапущен или база данных отключена и переведена в оперативный режимALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName', FILENAME = '<Full-Path-Required>\NewDbName.mdf');
ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName_log', FILENAME = '<Full-Path-Required>\NewDbName_log.ldf');
ALTER DATABASE
снова, чтобы установить новые логические имена файлов (снова, файлы данных и журналов)
Вступает в силу немедленноALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName', NEWNAME = 'NewDbName');
ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName_log', NEWNAME = 'NewDbName_log');
Перейдите в автономный режим и вернитесь в оперативный режим или перезапустите SQL Server
- Использование SQL Server Management Studio:
- Щелкните правой кнопкой мыши на переименованной базе данных и выберите
Take Offline
подTasks
, - Щелкните правой кнопкой мыши (автономная) база данных и выберите
Bring Online
подTasks
,
- Щелкните правой кнопкой мыши на переименованной базе данных и выберите
- Используя T-SQL:
ALTER DATABASE [CurrentName] SET OFFLINE WITH ROLLBACK IMMEDIATE;
(устанавливает его в автономный режим и отключает любые клиенты)ALTER DATABASE [CurrentName] SET ONLINE;
- Использование SQL Server Management Studio:
Полный код:
-- Find "CurrentName" (without quotes) and replace with the current database name
-- Find "NewDbName" (without quotes) and replace with the new database name
USE [CurrentName];
-- Change physical file names:
ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName', FILENAME = '<Full-Path-Required>\NewDbName.mdf');
ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName_log', FILENAME = '<Full-Path-Required>\NewDbName_log.ldf');
-- Change logical names:
ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName', NEWNAME = 'NewDbName');
ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName_log', NEWNAME = 'NewDbName_log');
-- Take offline and back online
USE [master]
GO
ALTER DATABASE [CurrentName] SET OFFLINE WITH ROLLBACK IMMEDIATE;
-- Then navigate to <Full-Path-Required> and rename the files
ALTER DATABASE [CurrentName] SET ONLINE;
Если вы не помните предыдущие имена файлов, откройте файл.mdf в шестнадцатеричном редакторе и со смещением 0x19D вы увидите строку UTF-16 (2 байта / символ) этого имени файла.
Ни один из этих ответов не был быстрым к конкретным ответам, поэтому я подумал, что просто добавлю свой ответ, чтобы указать на мои выводы (основанные на вкладе каждого здесь)...
Ситуация:
У вас есть файл базы данных и файл журнала, но нет их резервной копии. Вы пытаетесь подключиться к базе данных (более вероятно, пытаясь восстановить с сервера, который вышел из строя).
Эта проблема:
Вы изменили имя файлов MDF и LDF на другое, чем они были изначально. Вам нужно переименовать их обратно в исходные имена, а затем попытаться присоединиться.
Как переименовать файлы БД (простой способ):
- После того, как вы успешно подключили файлы MDF и LDF, вы хотите создать BAK-файл (резервную копию), сделав резервную копию базы данных.
- Далее вы хотите удалить / удалить базу данных с сервера SQL.
- Далее вы хотите восстановить базу данных. Здесь вы можете перейти в раздел ФАЙЛЫ (слева), который позволит вам изменить
Restore As
имя файла для того, что вы хотите, чтобы MDF и LDF файлы были названы как. - Затем я бы снова сделал ДРУГОЕ резервное копирование этой новой базы данных, чтобы на этот раз резервное копирование содержало правильные имена файлов, которые вы хотите.
Командная строка оказалась намного более щадящей с переименованными файлами. Обратите внимание, что это не сценарий "запустил и забыл"... запускайте каждую часть отдельно, обращая внимание на имена, которые необходимо изменить:
--#1 Attach the db
USE [master]
GO
CREATE DATABASE RenamedDB ON
( FILENAME = N'<PathToRenamedFile>\renamedDBFile.mdf' ),
( FILENAME = N'<PathToRenamedFile>\renamedDBFile_log.ldf' )
FOR ATTACH
GO
--#2 Get the old logical file names:
USE RenamedDB
select * from sys.database_files
--#3 Rename the old logical files
ALTER DATABASE RenamedDB MODIFY FILE (NAME=N'OldLogicalDBName', NEWNAME=N'renamedDBFile')
GO
ALTER DATABASE RenamedDB MODIFY FILE (NAME=N'OldLogicalLogName', NEWNAME=N'renamedDBFile_log')
GO
--#4 check for the new names
select * from sys.database_files
Мне приходилось перемещать / переименовывать БД несколько раз. Если вы находитесь в одной лодке, вот скрипт, который использует переменные, чтобы не вводить новые / старые имена снова и снова.
Он использует ту же логику из ответа Джесси, за исключением автоматического запуска резервного копирования БД для вас. Я предполагаю, что вам нужно включить его снова после перемещения / переименования физических файлов, отсюда и удаление этого оператора. Пожалуйста, прокомментируйте, если это предположение неверно.
Однако, чтобы отразить логическое переименование в SSMS, вам все еще нужно right click -> rename
, Это похоже на то же самое без использования EXECUTE
/REPLACE
метод ниже.
---------- CHANGE THESE ----------
-- Keep names identical to only move locations
DECLARE @CurrDbName AS varchar(255) = 'CurrentDbName'
DECLARE @NewDbName AS varchar(255) = 'NewDbName'
DECLARE @PathToFolder AS varchar(255) = '<FullPathMinusFilename>\'
---------- DECLARE TEMPLATES ----------
-- Use DB
DECLARE @USE_DB AS varchar(255) = 'USE [{CurrDbName}]'
-- Change physical file names
DECLARE @SET_PHYS_MDF AS varchar(255) = 'ALTER DATABASE [{CurrDbName}] MODIFY FILE (NAME = ''{CurrDbName}'', FILENAME = ''{PathToFolder}{NewDbName}.mdf'')'
DECLARE @SET_PHYS_LDF AS varchar(255) = 'ALTER DATABASE [{CurrDbName}] MODIFY FILE (NAME = ''{CurrDbName}_log'', FILENAME = ''{PathToFolder}{NewDbName}_log.ldf'')'
-- Change logical names (LOG = "logical", not "log")
If (@CurrDbName != @NewDbName)
BEGIN
DECLARE @SET_LOG_MDF AS varchar(255) = 'ALTER DATABASE [{CurrDbName}] MODIFY FILE (NAME = ''{CurrDbName}'', NEWNAME = ''{NewDbName}'')'
DECLARE @SET_LOG_LDF AS varchar(255) = 'ALTER DATABASE [{CurrDbName}] MODIFY FILE (NAME = ''{CurrDbName}_log'', NEWNAME = ''{NewDbName}_log'')'
END
-- Take offline
DECLARE @SET_OFFLINE AS varchar(255) = 'ALTER DATABASE [{CurrDbName}] SET OFFLINE WITH ROLLBACK IMMEDIATE'
---------- START DOING STUFF ----------
DECLARE @SQL_SCRIPT AS varchar(255)
-- Use DB
SET @SQL_SCRIPT = REPLACE(@USE_DB, '{CurrDbName}', @CurrDbName)
EXECUTE (@SQL_SCRIPT)
-- Change physical file names
SET @SQL_SCRIPT = REPLACE(REPLACE(REPLACE(@SET_PHYS_MDF, '{CurrDbName}', @CurrDbName), '{NewDbName}', @NewDbName), '{PathToFolder}', @PathToFolder)
EXECUTE (@SQL_SCRIPT)
SET @SQL_SCRIPT = REPLACE(REPLACE(REPLACE(@SET_PHYS_LDF, '{CurrDbName}', @CurrDbName), '{NewDbName}', @NewDbName), '{PathToFolder}', @PathToFolder)
EXECUTE (@SQL_SCRIPT)
-- Change logical names (LOG = "logical", not "log")
If (@CurrDbName != @NewDbName)
BEGIN
SET @SQL_SCRIPT = REPLACE(REPLACE(@SET_LOG_MDF, '{CurrDbName}', @CurrDbName), '{NewDbName}', @NewDbName)
EXECUTE (@SQL_SCRIPT)
SET @SQL_SCRIPT = REPLACE(REPLACE(@SET_LOG_LDF, '{CurrDbName}', @CurrDbName), '{NewDbName}', @NewDbName)
EXECUTE (@SQL_SCRIPT)
END
-- Take offline
USE [master]
SET @SQL_SCRIPT = REPLACE(@SET_OFFLINE, '{CurrDbName}', @CurrDbName)
EXECUTE (@SQL_SCRIPT)
-- Now turn off the database, rename/move physical files, and bring the database back online
Это мой первый ответ, извиняюсь, если он недостаточно качественный.