web-dev-qa-db-ja.com

データベースは読み取り専用であるか、読み取り専用ファイルがあるため、アップグレードできません。データベースまたはファイルを書き込み可能にして、リカバリを再実行します

データベースファイルを受け取り、それをロードする手順は、SQL Server 2005をインストールしてから、SQL Server Management Studioを使用して添付することです。

すべてをインストールした後、MDFファイルを添付しようとしましたが、次のように表示されます。

ファイル「D:{folderName} {filename} .LDF」のディレクトリ検索は、オペレーティングシステムエラー21(エラーが見つかりません)で失敗しました

LDFファイルはデータベースに付属していなかったため、おそらく自動的に生成されるはずです。

さて、Dドライブは私のCDドライブがある場所なので、そこには何も見つかりません。そこに何かを作ろうとする運もありません。

  1. 特定のパスでログファイルを検索しようとするのはなぜですか?データベースファイルがどこにあるのですか?

  2. このデータベースを接続するにはどうすればよいですか?

アタッチするデータベースを選択すると、「データベースの詳細」の下に3つのエントリが表示されることに気付きました。 MDF、NDF、およびLDF。 LDFの「現在のファイルパス」は上記のDドライブパスを指しているため、削除しました。

今回、「OK」をクリックすると、別のエラーメッセージが表示されます。

データベースは読み取り専用であるか、読み取り専用ファイルがあるため、アップグレードできません。
データベースまたはファイルを書き込み可能にして、リカバリを再実行します。

ファイルのアクティブ化に失敗しました。物理名D:{folder} {file} .LDFが正しくない可能性があります。
新しいログファイル「...」が作成されました(Microsoft SQL Server、エラー:3415)

そのため、データベースファイルと同じフォルダに新しいログファイルが作成されます。これはすばらしいことですが、セキュリティの問題があるようです。

追加情報:

  • この手順では、sysadminアカウントのように見えるログイン名「sa」を使用する必要があります。そのログインを使用してSQL Serverインスタンスに接続しています。

  • ファイルのプロパティが読み取り専用でないことを確認しました。ディレクトリも読み取り専用ではありません。すべてのACLが許可されます。

  • データベースをアタッチできません。アタッチしようとすると、「データベースのアタッチに失敗しました」というエラーメッセージが表示されます。

  • SSMSを閉じて、管理者として再び開くと、違いはありませんでした。

  • select SERVERPROPERTY('ProductVersion')は9.00.4035.00を返します。 「IsSql2000 = 1」と書かれている「dbdata.ini」と呼ばれるデータベースに付属する別のファイルがあるため、おそらくSQL Server 2000にロードすることを意図しています。2000で動作させることができるかどうか確認します。

8
MxLDevs

これはアクセスの問題ではありません。問題は、.mdfが最初に接続されていたインスタンスよりも上位のバージョンのSQL Serverにデータベースを接続していて、読み取り専用であるということです。 SQL Serverはアタッチの一部としてデータベースをアップグレードしようとしていますが、データベースが読み取り専用モードになっているため、アップグレードできません。

データベースがREAD_ONLYにある場合(エラーメッセージに基づいているようです)、データベースをアタッチするにはすべてのファイル(ログとデータの両方)が必要です TechnetのドキュメントによるFOR ATTACH句の下を見ると、次のように明示されています。

...読み取り専用データベースの場合、プライマリファイルを更新できないため、ログを再構築できません。したがって、ログが利用できない読み取り専用データベースを接続する場合は、FOR ATTACH句でログファイルまたはファイルを提供する必要があります。

データベースには、付随する.ldfが必要です。データベースを提供した人に連絡し、.mdfファイルと.ldfファイルの両方を提供するよう依頼します。その後、次の構文で添付できます。

CREATE DATABASE [foo]
ON (FILENAME='<<path to mdf>>')
LOG ON (FILENAME='<<path to ldf>>')
FOR ATTACH;

READ_ONLYステータスは、データベースのメタデータに保存されているため、アタッチしないとデータベースから削除できません。これを変更するには、データベースがオンラインで接続されている必要があります。

別の方法は、データベースのbackupを要求することです。接続の代わりにデータベースrestoreを実行している場合は、これらの問題のいくつかをより簡単に回避できます。

8
Mike Fal

私はこの質問に答えた投稿を見つけました:

これはすべてのケースで機能するわけではありませんが、セマンティック検索データベースをインストールしようとして、同じエラーが発生しました。

SQL Server Management Studioを管理者として実行する必要があり、機能します。

25
Data Juggler
  1. 私のコンピューターを開きます。
  2. 「.mdf」および「.ldf」ファイルを保存したメインフォルダーを見つけます。
  3. フォルダを右クリックし、[プロパティ]をクリックします。
  4. プロパティウィンドウで[セキュリティ]をクリックします
  5. 「編集」ボタンをクリックします
  6. リストされたユーザーに対して「読み取りと実行」、「読み取り」、「書き込み」を有効にし、データベースファイルまで以下のフォルダーに変更を適用します。
  7. 「.mdf」ファイルを添付してみてください

.mdfファイルと.ldfファイルを1つずつ右クリックして[プロパティ]をクリックし、下部に「このファイルは別のコンピューターから送信されたため、このコンピューターを保護するためにブロックされている可能性があります」と表示されています。ブロック解除ボタンをクリックします。

次に、右クリックして、[プロパティ]、[セキュリティ]タブ、[編集]ボタンの順にクリックし、「ユーザー」を選択して、フルコントロールのアクセス許可を付与します。

1
Subodh Pradhan

私の場合、解決策は、sysadminの役割を持つsqlユーザーの代わりにwindows Auth modeでSSMSにログインすることでした。 Windows認証モードで使用したユーザーに適切な権限があることを確認してください(私のケースはsysadminでした)私の推測では、SQLユーザーに適切な権限がありません。機械)

1
Ben F

私たちの場合の許可ではなく、それはSSMSのバージョンでした!

(エラーが発生したのはローカルで2012年でしたが、リモートボックスからSSMS 17+を使用したときに機能しました)

0
Bigpa