web-dev-qa-db-ja.com

mdfファイルをlocalDbに添付しようとすると、少なくとも1つのファイルが必要ですというエラーがスローされます

Here is error

TITLE:Microsoft SQL Server Management Studio

サーバー '(localdb)\ mssqllocaldb'のデータベースの接続に失敗しました。 (Microsoft.SqlServer.Smo)

追加情報:

データベース接続には少なくとも1つのファイルが必要です。 (Microsoft.SqlServer.Smo)

これを添付しようとしています.mdfデータベースファイルをLocalDbインスタンスに追加します。 SQL Serverにもできるなら大丈夫です。私が持っています .ldf同じディレクトリ内のファイル

16
Neeraj Sharma

完成のために- Jimのコメント は(半分の)問題を解決し、あなたを導きます。

問題の他の「半分」は-最終的に物理データベースファイルの名前を変更したい場合はどうなりますか?答えはこれで利用可能です CodeProject post


手順:

  1. _ALTER DATABASE_は、新しいphysicalファイル名(データファイルとログファイル)を設定します
    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_を再度設定して、新しいlogicalファイル名(再度、データおよびログファイル)を設定します
    すぐに効果を発揮します

    • 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. 名前を変更したデータベースを右クリックし、Tasksの下の_Take Offline_をクリックします。
      2. (オフライン)データベースを右クリックし、Tasksの下の_Bring Online_をクリックします。
    • 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;
_
22
Jesse

以前のファイル名を思い出せない場合、16進エディターで.mdfファイルを開くと、オフセット0x19D付近にそのファイル名のUTF-16(2バイト/文字)文字列が表示されます。

3
DeepSpace101

これらの答えはどれもすぐには答えられなかったので、私は答えを追加して私の発見を指摘するだけだと思いました(ここのみんなの貢献に基づいて)...

状況:

データベースファイルとログファイルがありますが、それらのバックアップはありません。データベースをアタッチしようとしています(ダウンしたサーバーから回復するための努力よりも)。

問題:

MDFおよびLDFファイルの名前を元の名前とは異なる名前に変更しました。元の名前に戻すには、ATTACHを試してください。

DBファイルの名前を変更する方法(簡単な方法):

  1. MDFおよびLDFファイルを正常にアタッチしたら、データベースをバックアップしてBAK(バックアップ)ファイルを作成します。
  2. 次に、SQLサーバーからデータベースをドロップ/削除します。
  3. 次に、データベースを復元します。ここで、ファイルセクション(左側)に移動して、Restore Asファイル名をMDFおよびLDFファイルに名前を付けます。
  4. 次に、この新しいデータベースの別のバックアップを再度作成し、今回は必要な正しいファイル名がバックアップに含まれるようにします。
2
Arvo Bowen

DBを数回移動/名前変更する必要がありました。同じ船に乗っている場合、変数を使用して新しい名前や古い名前を何度も入力しないようにするスクリプトを次に示します。

Jesse's answer と同じロジックを使用しますが、DBのバックアップを自動的に開始します。物理ファイルを移動/名前変更してからafterに戻す必要があると思います。したがって、そのステートメントを削除します。この仮定が間違っている場合はコメントしてください。

ただし、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

これが私の最初の答えです。十分な品質でない場合はおologiesび申し上げます。

1
Sinjai

コマンドラインは、名前が変更されたファイルに対してはるかに寛容であることが判明しました。これは、ファイアアンドフォーゲットスクリプトではないことに注意してください。各部分を個別に実行し、変更する必要がある名前に注意してください。

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