web-dev-qa-db-ja.com

データベースをアタッチするとアクセスが拒否されます

SQL Server 2008 Developer Editionを使用しています。 AdventureWorks2008データベースを添付しようとしていました。

接続しようとしたときに、「アクセスが拒否されました」というエラーが表示されました。イベントログによると、それはO/Sからのものです。

開くことができませんでした:ファイル番号0のファイルD:\ ProjectData\AdventureWorksLT\AdventureWorksLT2008_Data.mdfを開けませんでした。OSエラー:5(アクセスが拒否されました。).

「NTFSの問題」と思っていましたが、システム(および私)は両方のファイルに変更アクセスできます。

Saとしてログインすると、データベースを正常に接続できることがわかりましたが、ユーザーアカウントは機能しません。

私は自分のマシンのローカル管理者グループのメンバーであり、SQL Serverインスタンスのsysadminsロールにいます。

Saとしてログインする必要がある理由は何ですか?

139
JMarsch

すべてのコメントをありがとう。あなたの何人かが答えに私を導くのを助けました。私が見つけたものは次のとおりです。

これはSQLの問題ではなく、NTFSアクセス許可の問題でした。さらに、それは一種のバグのように見えます(そして繰り返し可能です)。

問題:私が使用していたアカウントには、mdfおよびldfファイルに対するフルコントロールのNTFSアクセス許可がありました。ただし、グループメンバーシップを通じてこれらのアクセス許可が与えられました(ローカル管理者グループにはアクセス許可があり、アカウントはローカル管理者のメンバーです)。 (許可を確認しました)

接続しようとすると、SQL Serverに私(adminsグループにいる)として接続すると、NTFSの問題で失敗します。

ただし、ローカル管理者グループがドメインアカウントに直接持っているのと同じファイルアクセス許可を付与すれば、問題なく接続できます。

(ああ、はい、このマシンのローカルグループをチェックし、ドメインアカウントが実際にローカル管理者グループのメンバーであることを確認しました)。

そのため、一部のコード(SQL ServerまたはManagement Studioのいずれか)がユーザーアカウントが保持するアクセス許可をチェックするためにエラーが発生したように見えますが、ユーザーアカウントが継承するグループアクセス許可をチェックすることはありません。

それは私には奇妙に聞こえますが、何度も何度も再現できるので、それが答えだと結論付けました。

更新:これをバグとして報告しました: https://connect.Microsoft.com/SQLServer/feedback/details/539703/access -denied-attaching-a-a-database-when-permissions-are-inherited

100
JMarsch

管理者としてSQL Server Management Studioを実行します。 (右クリック->管理者として実行)これは私の場合のすべての奇妙さを処理しました。

SQL SRV EXPRESS 2008 R2。 Windows 7

151
MandoMando

投稿された回答に追加情報を追加したいと思います。

データベースをデタッチするときは注意してくださいwindows userは.mdfへのアクセス許可を持つ唯一のユーザーになるため、ログインしているためですファイル!ユーザーSQLServerMSSQLUser$<computer_name>$<instance_name>およびAdministratorsアカウントを含む.mdfファイルの元の権限は、ログインしているWindowsユーザー(sqlサーバーユーザーではない)によって上書きされます。ブーム、すべての許可はそのようになりました。だから他の人が言ったように、あなたの.mdfファイルを右クリックして、パーミッションを再確認してください。

SSMSを使用してデータベースに接続し(どのSQLサーバーアカウントでも構いません)、データベースを切り離したため、この問題に遭遇しました。それを行った後、Windowsユーザーは.mdfファイルへのアクセス権を持つ唯一のユーザーになりました。そのため、後でsaアカウントを使用してdbをアタッチしようとすると、「アクセス拒否」エラーがスローされました。

元の権限をそのまま維持するには、データベースをオフラインにしてから、切り離し、次にその順序で接続する必要があります。

USE [master]
GO
-- kick all users out of the db
ALTER DATABASE mydb
SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO

-- Take the Database Offline
ALTER DATABASE mydb SET OFFLINE WITH
ROLLBACK IMMEDIATE
GO

-- detach the db
EXEC master.dbo.sp_detach_db @dbname = N'mydb'
GO
18
goku_da_master

.mdfファイルがあるフォルダーにアクセス許可を追加します。

この名前を確認してください:NT Service\MSSQLSERVER

そして、Locationをサーバー名に変更します。

17
Leonardo

この問題はUAC(ユーザーアカウント制御)が原因です。ユーザーアカウントはAdministratorsグループのメンバーですが、Windows 7のUACでは、「管理者として」プログラムを実行しない限り、管理者の操作を行うことはできません。 SQL ServerやManagement Studioなどの本当のバグではありません。 (問題を知っている可能性がありますが、単に「エラー5」と文句を言うのではなく、昇格したアクセス許可を求めることができます。)

13
Al Kepp

管理者としてSQL Server Management Studioを実行します。 (右クリック->管理者として実行)Windows 7-SQL Server 2008 R2で私のために働いた

11
Rolwin C

SQL2005データベースは、Windows 7で次の方法で接続できます。

start menu >
 all program >
  Microsoft sql server 2005 >
   sql server management studio >
    right click >
     run as administrator >
      click ok

そして、接続されたデータベースが正常に完了しました。

9

sa(または任意のSql Serverアカウント)としてログインすると、SQL Serverサービスアカウントとして機能します。ログインすると、アカウントの権限が付与されます。何らかの理由で適切なファイルアクセス権がありませんが、サービスアカウントにはあります。

8
Nick Craver

私はこの解決策を見つけました:.mdfファイルを保存するフォルダーを右クリック-> [プロパティ]-> [セキュリティ]タブを選択し、[編集...]をクリックして、フルコントロールを与えます。お役に立てれば!

5
quokka

私と一緒に-ウィンドウ8で実行しています-[SQL Server Manager Studio]-> [管理者で実行]をクリックします。 ->問題なし

5
Grey Wolf

easyfixedですが、過激です。保存したフォルダーに移動してくださいmdf file。ファイルを選択->右クリック->プロパティをクリックし、ログインしているユーザーSecurityに対してファイルへの完全な許可を与えます

5
Ema.H

saユーザーは、NTFSアカウントSQLServerMSSQLUser$<computer_name>$<instance_name>およびSQLServerSQLAgentUser$<computer_name>$<instance_name>を使用してデータベースファイルにアクセスします。これらのユーザーの片方または両方に許可を追加してみてください。

saユーザーに問題はないと言っているので、問題が解決するかどうかはわかりませんが、助けになると思います。

4
djeidot

この問題に出くわすたびに、SQLサーバーでセットアップされているデフォルトのデータベースディレクトリとは異なるディレクトリにあるデータベースを接続しようとしました。

さまざまなディレクトリおよびアカウントのアクセス許可をジャッキングする代わりに、単にデータファイルをSQL Serverが検出するディレクトリに移動することを強くお勧めします。

3
NotMe

この情報も追加したかっただけです。

http://www.mssqltips.com/sqlservertip/2528/database-attach-failure-in-sql-server-2008-r2/

解決

2つの異なるログインがデタッチおよびアタッチ操作を行ったため、このエラーが発生します。したがって、ファイルは、切り離されたときに最初のログインによって所有されていましたが、使用されたログインがmdfファイルとldfファイルの所有者ではなかったため、アタッチは失敗しました。

データベースファイルをデタッチすると、所有者がdetachコマンドを実行した人になるため、問題を解決するには、他のログインをmdfファイルとldfファイルの所有者として変更または追加する必要があります。

「filename.mdf」ファイルを右クリックし、プロパティを選択してmdfファイルの権限を確認します。ここでは、データベースをデタッチするために使用されたアカウントであるため、1つのアカウントのみが「filename.mdf」ファイルへのアクセス許可を持っていることがわかります。

この問題を解決するには、[追加...]ボタンをクリックして、他のログインまたは必要なログインを追加し、ログインにフルコントロールを与えます。 「ldf」ファイルに対してもこれを行う必要があります。このタスクを完了したら、[OK]ボタンをクリックします。 (他のOSバージョンの場合は、[編集]オプションがある場合があります。最初にこれをクリックすると、[追加...]オプションが表示されます。)

3
stormwild

私が持っていたこの問題の特定のバリエーションを持っている人にとってそれが価値があるもののために:

  • SQL Express 2008
  • Visual Studio 2010 Premium

App_dataフォルダーのコンテキストメニューを使用して、デバッグ用にSQL Expressデータベースを作成しました。接続文字列(NHibernateで使用)は次のとおりです。

Server=.\SQLExpress;
AttachDbFilename=|DataDirectory|DebugDatabase.mdf;
Database=DebugDatabase;
Trusted_Connection=Yes;

これにより、データベースファイルで同じ「アクセス拒否」エラーが発生しました。さまざまなユーザーに、ある時点で「全員」にさえ、フォルダとファイルに対するフルコントロールを与えようとしました。何も役に立たなかったので、追加した権限を再度削除しました。

最終的にそれを解決したのは、Visual Studioでサーバーエクスプローラを開き、MDFに接続して、再び切り離すことでした。完了した後、私のWebアプリはデータベースに正常にアクセスできました。

PS。クレジットは このブログ記事 にあります。この特定の問題をグーグルで検索しているときに、データベースをアタッチ/デタッチして問題を解決するアイデアをトリガーしました。

2
Jeroen

データベースmdfをデフォルトのDataフォルダーからasp.net app_dataフォルダーに移動し、データベースをオンラインに戻そうとしてこの問題に遭遇しました。

元の場所にある他のファイルデータベースのセキュリティ設定を移動したファイルと比較し、MSSQL $ SQLEXPRESSに新しい場所のファイルへのアクセス許可が割り当てられていないことに気付きました。 「NT SERVICE\MSSQL $ SQLEXPRESS」のフルコントロールを追加し(そのNT SERVICEを含める必要があります)、うまく接続できました。

元のDataフォルダにはこれらの権限があり、ファイルはそれを継承しているようです。もちろん、ファイルと継承ブレークを移動します。

App_dataフォルダーに直接作成した別のプロジェクトのmdfファイルをチェックしました。 MSSQL $ SQLEXPRESS権限はありません。うーん。 SQL Expressが他を好まないのになぜ好むのだろうか?

2
Brad Mathews

enter image description here

USE [master]
GO
CREATE DATABASE [DataBasename] ON 
( FILENAME = N'C:\data\DataBasename.mdf' )
 FOR ATTACH
GO

への変更 FOR ATTACH-> FOR ATTACH_FORCE_REBUILD_LOG

USE [master]
GO
CREATE DATABASE [DataBasename] ON 
( FILENAME = N'C:\data\DataBasename.mdf' )
 FOR ATTACH_FORCE_REBUILD_LOG
GO
1
Valentin Petkov

私はsaとしてこのエラーを受け取りました。私の場合、データベースのセキュリティは重要ではありませんでした。私は誰もがmdfファイルとldfファイルにフルコントロールを追加し、アタッチはうまくいきました。

1
toddmo

データベースを接続するときに同じ問題が発生しました。これはSQLの問題ではなく、アカウントの問題でした。パネルコントロール/ユーザーアカウントコントロール設定/「通知しない」に設定します。最後に、コンピューターを再起動してください。

1
Paola

データベースを右クリックし、ウィザードでAdventureWorks2012_Data_log.ldfログファイルを削除して、mdfファイルを添付しました。 mdfファイルは次の場所に配置されました

    C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA

上記の方法は私が問題を解決するのに役立ちました。

1
praveen

このページ を読んでいて、そこに興味深い文章があります:

注意:これらのロールにユーザーを追加するときは、厳選してください。たとえば、sysadminはすべてのデータベースのdboにマップされ、saアカウントを使用してログインするのと同等です。

もちろん、彼らはこれも持っています:

ユーザーおよびロールに付与され、データベース固有の権限。 DENYを除き、すべての許可は累積的です。ユーザーレベルまたはロールレベルで拒否されたアクセス許可は、sysadmin固定サーバーロールを除き、他のロールメンバーシップを介して付与された同じアクセス許可よりも優先されます。 (sysadminは、メンバーであるロールにDENYパーミッションが設定されている場合でも、すべてのパーミッションを保持します。)

あなたがドメイン管理者であり、SQL「sysadmin」グループに属している場合、世界はあなたの甲殻類でなければなりません。

もちろん、マイクロソフトによると、次の2つのページを簡単に確認する必要があります。
データベースの前提条件へのリンク

データベースのインストールへのリンク

あなたはいたずらで、それらを手動で添付しようとしています:)しかし、真剣に、AdventureWorks2008データベースのすべての前提条件はありますか?
これはマイクロソフトの奇妙な/エッジのケースの1つに過ぎないと思いますが、間違っている可能性があります。

1
Trevoke

これはNTFSアクセス許可のように聞こえます。通常、SQL Serverサービスアカウントにはファイルへの読み取り専用アクセス権があることを意味します(SQL Serverは、ログイン方法に関係なく、同じサービスアカウントを使用してデータベースファイルにアクセスすることに注意してください)。自分としてログインしてからsaとしてログインするまでの間、フォルダのアクセス許可を変更しなかったのですか?デタッチして再試行しても、同じ問題が発生しますか?

1
Adrian O'Connor

ここで他のソリューションで問題を解決できなかった人のために、次の修正が私のために働いた:

SQL Serverインストールの[データ]フォルダーに移動し、右クリック、プロパティ、セキュリティタブを選択し、[ネットワークサービス]ユーザーのフルコントロールアクセス許可を追加します。

http://decoding.wordpress.com/2008/08/25/sql-server-2005-expess-how-to-fix-error-3417/

(上記のリンクはSQL 2005用ですが、これによりSQL 2008 R2のインストールが修正されました)。

いくつかの追加情報:セカンダリハードドライブ(SQLインストールがオンになっている)を交換すると、この問題が発生しました。すべてのファイルをコピーし、元のドライブ文字を新しいハードディスクに復元しました。ただし、セキュリティ権限はコピーされませんでした。次回はデータをコピーするより良い方法を使用すると思います。

0
nuzzolilo

これは、実際にはNTFSアクセス許可であり、SQL Serverの奇妙なバグです。上記のバグレポートが正確であるか、または追加のバグに言及しているのかはわかりません。

Windows 7でこれを解決するには、SQL Server Management Studioを(管理者としてではなく)通常実行しました。次に、MDFファイルを添付しようとしました。このプロセスでは、パスに貼り付けるのではなくUIを使用しました。私はその道が私から遮断されていることに気付きました。これは、ソフトウェアが追加するMS SQL Server(SQLServerMSSQLUser $ machinename $ SQLEXPRESS)ユーザーには、フォルダー(この場合は自分のユーザーフォルダーの深いフォルダー)にアクセスする権限がないためです。

パスを貼り付けて続行すると、上記のエラーが発生します。だから-私はそれが拒否された最初のディレクトリ(私のユーザーフォルダ)から始まるMS SQL Serverのユーザー権限を与えました。永遠にかかる可能性があるため、伝播操作をすぐにキャンセルし、必要な次のサブフォルダーに読み取り権限を再度適用し、完全に伝播させました。

最後に、MS SQL Serverユーザーに、dbの.mdfファイルと.ldfファイルに対する変更権限を与えました。

これで、データベースファイルにアタッチできます。

0
Chris Moschini

データベースをデタッチした後、データベースを再アタッチし、ldfおよびmdfファイルをドライブCからFに移動したときに、同じ問題が発生しました。

修正するには、両方のファイルにOWNER RIGHTSプリンシパルを追加し、[プロパティ]ダイアログの[セキュリティ]タブでそれらを完全に制御する必要がありました。

0
Art

パブリックフォルダーに添付する.mdfファイルを移動するだけで問題を解決しました。私の場合は、users/publicフォルダーに移動しました。その後、そこから問題なく接続します。お役に立てれば。

0
databaseUser

私の場合、問題を解決したのは次のとおりです。

USE [master]
GO
CREATE DATABASE [AdventureWorks2008R2] ON
( FILENAME = 'C:\Program Files\Microsfot SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\AdventureWors2008R2_Data.mdf')
FOR ATTACH_REBUILD_LOG
0
Nick_

データベースを他のフォルダーにコピーし、「Windows認証」でSQLServerに接続またはログインします

enter image description here

0
Chưa biết

AdventureWorks2012データベースを添付するために、SSMS(2016)に苦労しました。 Mohammad ElsheimyによるCodeProjectの記事 から取られたこのコードで成功しました。

CREATE DATABASE AdventureWorks2012
    ON PRIMARY (FILENAME='D:\Dev\SQL Server\AdventureWorks2012.mdf')
    FOR ATTACH;
0
Michael Melio

SQL Server 2012を実行している場合、mdfファイルの古いバージョンを添付しようとすると、このエラーが発生します。 ex SQL Server 2008のmdfファイル。

0
Erik Forsmyr