デフォルトのフォルダは通常のC:\ Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATAです。しかし、C:サーバーのドライブはほぼいっぱいです。
そこで、別のサーバーから11GBデータベースを復元する際に、同じサーバーでL:ドライブを使用することにしました。
L:\ SQL\Data(私が作成したフォルダ)に復元しようとしました。アクセスが拒否されました。
後ですばやくグーグル検索すると、SQL ServerサービスがNT SERVICE\MSSQLSERVERによって開始されているので、MSSQLSERVERをL:\ SQL\Dataフォルダーの所有者にして、そのフォルダーに対する完全なアクセス許可を与えます。
もう一度復元してみてください。アクセスが拒否されました。
うーん。同じ場所に新しいデータベースを作成してみてください。アクセスが拒否されました。
デフォルトのフォルダに新しいデータベースを作成し、デタッチし、mdf/ldfをL:\ SQL\Dataに移動して、すべてのフォルダとファイルの権限と所有権がMSSQLSERVERに設定されていることを確認してから、CREATE DATABASE ... FOR ATTACHを使用してアタッチします。読み取り専用モードで作成されたデータベース。
読み取り/書き込みモードに変更してみてください。アクセスが拒否されました。
C:\ Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQLにフォルダーdataxを作成し、適切な権限/所有権を付与します。そこで新しいデータベースを作成します。出来た!
1つのフォルダーに戻り、C:\ Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVERにフォルダーデータを作成し、適切な権限/所有権を付与します。そこで新しいデータベースを作成します。アクセスが拒否されました。
C:\ temp\dataフォルダーを作成し、適切なアクセス許可/所有権を付与します。アクセスが拒否されました。
SQL Serverサービスが再起動されました。サーバーが再起動されました。同じ結果。
Xp_cmsshellを使用したこの最後のビットは、気晴らしのビットかもしれません...
したがって... EXEC xp_cmdshell 'md l:\ data'を試してみました。メッセージバック:「xp_cmdshellの実行中にエラーが発生しました。'CreatePipe 'の呼び出しがエラーコード' 5 'で失敗しました。」
L:のルートのアクセス権を変更しました。同じ結果です。
EXEC xp_cmdshell 'dir c:*。*';同じ結果。
EXEC xp_cmdshell 'whoami/all';同じ結果。
とにかく、一番下の行は、dbの復元/作成時に「アクセス拒否」を取得するためにここで読んだすべてのことは、フォルダーのアクセス許可が原因です。しかし、私が知ることができる最善のことは、それらが正しいことです。継承されたアクセス許可と明示的なアクセス許可の違いをいくつか試しました。
私が遭遇した2つのリンクは、データ/ログファイルをどこにでも、つまりデフォルトの場所の外に置くことに固有の制限がないことを示しています。
このサーバーにはそのレベルの自由度がないため、SQL Serverサービスのサービスアカウントを変更しようとしませんでした。
また、これはローカルマシンとサーバーの両方のSSMSからのものであり、常にドメインの管理者のコンテキストで接続されます。
私が最初にすることは、権限が正しいアカウントに設定されていることを確認することでしょう。実行:sys.dm_server_servicesからservicename、service_accountを選択して、権限を設定する必要があるアカウントを取得します。
GUIを処理してファイル/フォルダーのアクセス許可を正しく設定することができなかったので、以下の例のICALCS.EXEを使用して、ファイルBのインスタンスの仮想サービスアカウントにファイルのアクセス許可を設定します。
icacls R:\SqlData\a\x.mdf /setowner MSSQL$A
icacls R:\SqlData\a\x.mdf /grant MSSQL$A:F
icacls R:\SqlData\a\x_log.ldf /setowner MSSQL$A
icacls R:\SqlData\a\x_log.ldf /grant MSSQL$A:F
デフォルトのSQL Server DATAディレクトリを確認し、master.mdfファイルの権限を確認することで、これを解決できました。 [セキュリティ]> [権限]領域に「MSSQLSERVER」と「所有者権限」があることがわかりました。そこで、「NT Service\MSSQLSERVER」と「OWNER RIGHTS」をセキュリティ権限に追加し、フルコントロールしました。それを行うと、データベースの.mdf/.ldfファイルを添付することができました。クラッシュしたマシンのハードドライブから引き抜かれ、事前に「切り離され」ていませんでした。