Попытка прикрепить mdf-файл к localDb выдает ошибку. Требуется хотя бы один файл.

Вот ошибка

НАЗВАНИЕ: Microsoft SQL Server Management Studio

Ошибка подключения базы данных для сервера '(localdb)\mssqllocaldb'. (Microsoft.SqlServer.Smo)

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

По крайней мере один файл необходим для присоединения базы данных. (Microsoft.SqlServer.Smo)

Я пытаюсь прикрепить это .mdf файл базы данных в мой экземпляр LocalDb. Хорошо, если я смогу сделать это с SQL Server тоже. я имею .ldf файл в том же каталоге

4 ответа

Решение

Ради завершения - комментарий Джима решает (наполовину) проблему и заставляет вас двигаться дальше.

Другая "половина" проблемы - что, если вы в конечном итоге захотите переименовать физический файл базы данных? Ответ доступен в этом посте CodeProject.


шаги:

  1. 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');
  2. ALTER DATABASEснова, чтобы установить новые логические имена файлов (снова, файлы данных и журналов)
    Вступает в силу немедленно

    • ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName', NEWNAME = 'NewDbName');
    • ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName_log', NEWNAME = 'NewDbName_log');
  3. Перейдите в автономный режим и вернитесь в оперативный режим или перезапустите SQL Server

    • Использование SQL Server Management Studio:
      1. Щелкните правой кнопкой мыши на переименованной базе данных и выберите Take Offline под Tasks,
      2. Щелкните правой кнопкой мыши (автономная) база данных и выберите Bring Online под Tasks,
    • Используя T-SQL:
      1. ALTER DATABASE [CurrentName] SET OFFLINE WITH ROLLBACK IMMEDIATE; (устанавливает его в автономный режим и отключает любые клиенты)
      2. ALTER DATABASE [CurrentName] SET ONLINE;

Полный код:

-- 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 на другое, чем они были изначально. Вам нужно переименовать их обратно в исходные имена, а затем попытаться присоединиться.

Как переименовать файлы БД (простой способ):

  1. После того, как вы успешно подключили файлы MDF и LDF, вы хотите создать BAK-файл (резервную копию), сделав резервную копию базы данных.
  2. Далее вы хотите удалить / удалить базу данных с сервера SQL.
  3. Далее вы хотите восстановить базу данных. Здесь вы можете перейти в раздел ФАЙЛЫ (слева), который позволит вам изменить Restore Asимя файла для того, что вы хотите, чтобы MDF и LDF файлы были названы как.
  4. Затем я бы снова сделал ДРУГОЕ резервное копирование этой новой базы данных, чтобы на этот раз резервное копирование содержало правильные имена файлов, которые вы хотите.

Командная строка оказалась намного более щадящей с переименованными файлами. Обратите внимание, что это не сценарий "запустил и забыл"... запускайте каждую часть отдельно, обращая внимание на имена, которые необходимо изменить:

--#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

Это мой первый ответ, извиняюсь, если он недостаточно качественный.

Другие вопросы по тегам