TITLE:Microsoft SQL Server Management Studio
サーバー '(localdb)\ mssqllocaldb'のデータベースの接続に失敗しました。 (Microsoft.SqlServer.Smo)
追加情報:
データベース接続には少なくとも1つのファイルが必要です。 (Microsoft.SqlServer.Smo)
これを添付しようとしています.mdf
データベースファイルをLocalDbインスタンスに追加します。 SQL Serverにもできるなら大丈夫です。私が持っています .ldf
同じディレクトリ内のファイル
完成のために- Jimのコメント は(半分の)問題を解決し、あなたを導きます。
問題の他の「半分」は-最終的に物理データベースファイルの名前を変更したい場合はどうなりますか?答えはこれで利用可能です CodeProject post 。
手順:
_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');
_ALTER DATABASE
_を再度設定して、新しいlogicalファイル名(再度、データおよびログファイル)を設定します
すぐに効果を発揮します
ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName', NEWNAME = 'NewDbName');
ALTER DATABASE [CurrentName] MODIFY FILE (NAME = 'CurrentName_log', NEWNAME = 'NewDbName_log');
オフラインにしてオンラインに戻すか、SQL Serverを再起動する
Tasks
の下の_Take Offline
_をクリックします。Tasks
の下の_Bring Online
_をクリックします。ALTER DATABASE [CurrentName] SET OFFLINE WITH ROLLBACK IMMEDIATE;
_(オフラインに設定し、クライアントを切断します)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;
_
以前のファイル名を思い出せない場合、16進エディターで.mdfファイルを開くと、オフセット0x19D付近にそのファイル名のUTF-16(2バイト/文字)文字列が表示されます。
これらの答えはどれもすぐには答えられなかったので、私は答えを追加して私の発見を指摘するだけだと思いました(ここのみんなの貢献に基づいて)...
状況:
データベースファイルとログファイルがありますが、それらのバックアップはありません。データベースをアタッチしようとしています(ダウンしたサーバーから回復するための努力よりも)。
問題:
MDFおよびLDFファイルの名前を元の名前とは異なる名前に変更しました。元の名前に戻すには、ATTACHを試してください。
DBファイルの名前を変更する方法(簡単な方法):
Restore As
ファイル名をMDFおよびLDFファイルに名前を付けます。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 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