web-dev-qa-db-ja.com

ローカルSQL Serverインスタンスへの管理者アクセス権を自分で付与するにはどうすればよいですか?

SQL Server 2008 R2をローカルマシンにインストールしました。しかし、権利(または権利の欠如)のために新しいデータベースを作成することはできません。

「データベース権限の作成が拒否されました」

だから、現在のログインに管理者権限を割り当てようとしました

「ユーザーにはこのアクションを実行する権限がありません。」

また、管理者権限を持っているが運のない新しいログインを作成しようとしました。 データベースを作成できるように自分に管理者権限を付与するにはどうすればよいですか?再インストールできますが、したくないです。

83
SkonJeet

はい-SQL Serverのインストール時にsysadminロールに自分を追加するのを忘れたようです。マシンのローカル管理者である場合、 このブログ投稿 を使用すると、SQLCMDを使用して、再インストールせずにアカウントをSQL Server sysadminグループに追加できます。あなたが私に尋ねると、それはSQL Serverのセキュリティホールのビットですが、この場合に役立ちます。

65
Brian Knight

コマンドプロンプトウィンドウを開きます。 SQL Serverの既定のインスタンスが既に実行されている場合は、コマンドプロンプトで次のコマンドを実行して、SQL Serverサービスを停止します。

net stop mssqlserver

次に、SQLサーバーがインストールされているディレクトリに移動します。ディレクトリは、たとえば次のいずれかです。

C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn
C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn

MSSQLディレクトリとCDをそのように把握します。

CD C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn

次のコマンドを実行して、SQL Serverをシングルユーザーモードで起動します。 SQLCMDが指定されているため、(別のコマンドプロンプトウィンドウから)SQLCMD接続を1つだけ作成できます。

sqlservr -m"SQLCMD"

次に、上記のシングルユーザーモードでSQL Serverを起動したユーザーと同じユーザーとして別のコマンドプロンプトウィンドウを開き、次のコマンドを実行します。

sqlcmd

Enterキーを押します。これで、シングルユーザーモードで実行されているSQL Serverインスタンスに対してSQLステートメントを実行できます。

create login [<<DOMAIN\USERNAME>>] from windows;

-- For older versions of SQL Server:
EXEC sys.sp_addsrvrolemember @loginame = N'<<DOMAIN\USERNAME>>', @rolename = N'sysadmin';

-- For newer versions of SQL Server:
ALTER SERVER ROLE [sysadmin] ADD MEMBER [<<DOMAIN\USERNAME>>];

GO

ソース

更新ALTER SERVER ROLE [sysadmin] ADD MEMBER [<<DOMAIN\USERNAME>>];の後にセミコロンを忘れないでください。また、GOの後に余分なセミコロンを追加しないでください。そうしないと、コマンドが実行されません。

63
Darren

私はシステム管理者ではなく、マシンの管理者であるSQL 2012データベースを採用しました。 「管理者として実行」でSSMSを使用し、NTアカウントをSQLログインとして追加し、サーバーロールをsysadminに設定しました。問題ない。

31
Vince P.

これを修正できると主張するスクリプトを次に示します。

この単純なスクリプトを使用して、ローカルSQL Server Expressの管理者権限を取得します

スクリプトへのダウンロードリンク

説明

このコマンドスクリプトを使用すると、ローカルSQL Serverインスタンスのsysadminロールに自分を簡単に追加できます。 WindowsローカルAdministratorsグループのメンバーであるか、ユーザーの資格情報にアクセスできる必要があります。このスクリプトは、SQL Server 2005以降をサポートしています。

このスクリプトは、他の人がインストールしたSQL Server 2008 Expressを使用する開発者である場合に最も役立ちます。この状況では、通常、SQL Server 2008 Expressインスタンスに対する管理者権限はありません。これは、デフォルトでは、SQL Server 2008をインストールする人にのみ管理者権限が付与されるためです。

SQL Server 2008 Expressをインストールしたユーザーは、SQL Server Management Studioを使用して必要な特権を付与できます。しかし、SQL Server Management Studioがインストールされていない場合はどうでしょうか?または、インストールしているユーザーがもう利用できない場合はさらに悪いですか?

このスクリプトは、数回クリックするだけで問題を修正します!

注:BATファイルに「インスタンス名」を指定する必要があります(「MSSQLSERVER」になる可能性がありますが、そうでない場合があります)。まず、「Microsoft SQL Server管理コンソール」で次のコマンドを実行して、 」:

 SELECT @@servicename

次に、BATファイルが「SQLインスタンス名」の入力を求めるときに使用する結果をコピーします。

  @echo off 
    rem 
    rem **************************************************************************** 
    rem 
    rem    Copyright (c) Microsoft Corporation. All rights reserved. 
    rem    This code is licensed under the Microsoft Public License. 
    rem    THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF 
    rem    ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY 
    rem    IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR 
    rem    PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT. 
    rem 
    rem **************************************************************************** 
    rem 
    rem CMD script to add a user to the SQL Server sysadmin role 
    rem 
    rem Input:  %1 specifies the instance name to be modified. Defaults to SQLEXPRESS. 
    rem         %2 specifies the principal identity to be added (in the form "<domain>\<user>"). 
    rem            If omitted, the script will request elevation and add the current user (pre-elevation) to the sysadmin role. 
    rem            If provided explicitly, the script is assumed to be running elevated already. 
    rem 
    rem Method: 1) restart the SQL service with the '-m' option, which allows a single connection from a box admin 
    rem            (the box admin is temporarily added to the sysadmin role with this start option) 
    rem         2) connect to the SQL instance and add the user to the sysadmin role 
    rem         3) restart the SQL service for normal connections 
    rem 
    rem Output: Messages indicating success/failure. 
    rem         Note that if elevation is done by this script, a new command process window is created: the output of this 
    rem         window is not directly accessible to the caller. 
    rem 
    rem 
    setlocal 
    set sqlresult=N/A 
    if .%1 == . (set /P sqlinstance=Enter SQL instance name, or default to SQLEXPRESS: ) else (set sqlinstance=%1) 
    if .%sqlinstance% == . (set sqlinstance=SQLEXPRESS) 
    if /I %sqlinstance% == MSSQLSERVER (set sqlservice=MSSQLSERVER) else (set sqlservice=MSSQL$%sqlinstance%) 
    if .%2 == . (set sqllogin="%USERDOMAIN%\%USERNAME%") else (set sqllogin=%2) 
    rem remove enclosing quotes 
    for %%i in (%sqllogin%) do set sqllogin=%%~i 
    @echo Adding '%sqllogin%' to the 'sysadmin' role on SQL Server instance '%sqlinstance%'. 
    @echo Verify the '%sqlservice%' service exists ... 
    set srvstate=0 
    for /F "usebackq tokens=1,3" %%i in (`sc query %sqlservice%`) do if .%%i == .STATE set srvstate=%%j 
    if .%srvstate% == .0 goto existerror 
    rem 
    rem elevate if <domain/user> was defaulted 
    rem 
    if NOT .%2 == . goto continue 
    echo new ActiveXObject("Shell.Application").ShellExecute("cmd.exe", "/D /Q /C pushd \""+WScript.Arguments(0)+"\" & \""+WScript.Arguments(1)+"\" %sqlinstance% \""+WScript.Arguments(2)+"\"", "", "runas"); >"%TEMP%\addsysadmin{7FC2CAE2-2E9E-47a0-ADE5-C43582022EA8}.js" 
    call "%TEMP%\addsysadmin{7FC2CAE2-2E9E-47a0-ADE5-C43582022EA8}.js" "%cd%" %0 "%sqllogin%" 
    del "%TEMP%\addsysadmin{7FC2CAE2-2E9E-47a0-ADE5-C43582022EA8}.js" 
    goto :EOF 
    :continue 
    rem 
    rem determine if the SQL service is running 
    rem 
    set srvstarted=0 
    set srvstate=0 
    for /F "usebackq tokens=1,3" %%i in (`sc query %sqlservice%`) do if .%%i == .STATE set srvstate=%%j 
    if .%srvstate% == .0 goto queryerror 
    rem 
    rem if required, stop the SQL service 
    rem 
    if .%srvstate% == .1 goto startm 
    set srvstarted=1 
    @echo Stop the '%sqlservice%' service ... 
    net stop %sqlservice% 
    if errorlevel 1 goto stoperror 
    :startm 
    rem 
    rem start the SQL service with the '-m' option (single admin connection) and wait until its STATE is '4' (STARTED) 
    rem also use trace flags as follows: 
    rem     3659 - log all errors to errorlog 
    rem     4010 - enable shared memory only (lpc:) 
    rem     4022 - do not start autoprocs 
    rem 
    @echo Start the '%sqlservice%' service in maintenance mode ... 
    sc start %sqlservice% -m -T3659 -T4010 -T4022 >nul 
    if errorlevel 1 goto startmerror 
    :checkstate1 
    set srvstate=0 
    for /F "usebackq tokens=1,3" %%i in (`sc query %sqlservice%`) do if .%%i == .STATE set srvstate=%%j 
    if .%srvstate% == .0 goto queryerror 
    if .%srvstate% == .1 goto startmerror 
    if NOT .%srvstate% == .4 goto checkstate1 
    rem 
    rem add the specified user to the sysadmin role 
    rem access tempdb to avoid a misleading shutdown error 
    rem 
    @echo Add '%sqllogin%' to the 'sysadmin' role ... 
    for /F "usebackq tokens=1,3" %%i in (`sqlcmd -S np:\\.\pipe\SQLLocal\%sqlinstance% -E -Q "create table #foo (bar int); declare @rc int; execute @rc = sp_addsrvrolemember '$(sqllogin)', 'sysadmin'; print 'RETURN_CODE : '+CAST(@rc as char)"`) do if .%%i == .RETURN_CODE set sqlresult=%%j 
    rem 
    rem stop the SQL service 
    rem 
    @echo Stop the '%sqlservice%' service ... 
    net stop %sqlservice% 
    if errorlevel 1 goto stoperror 
    if .%srvstarted% == .0 goto exit 
    rem 
    rem start the SQL service for normal connections 
    rem 
    net start %sqlservice% 
    if errorlevel 1 goto starterror 
    goto exit 
    rem 
    rem handle unexpected errors 
    rem 
    :existerror 
    sc query %sqlservice% 
    @echo '%sqlservice%' service is invalid 
    goto exit 
    :queryerror 
    @echo 'sc query %sqlservice%' failed 
    goto exit 
    :stoperror 
    @echo 'net stop %sqlservice%' failed 
    goto exit 
    :startmerror 
    @echo 'sc start %sqlservice% -m' failed 
    goto exit 
    :starterror 
    @echo 'net start %sqlservice%' failed 
    goto exit 
    :exit 
    if .%sqlresult% == .0 (@echo '%sqllogin%' was successfully added to the 'sysadmin' role.) else (@echo '%sqllogin%' was NOT added to the 'sysadmin' role: SQL return code is %sqlresult%.) 
    endlocal 
    pause
29
Chris Gessler

Microsoftには、この問題に関する記事があります。順を追って説明します。

https://docs.Microsoft.com/en-us/sql/database-engine/configure-windows/connect-to-sql-server-when-system-administrators-are-locked-out

要するに、他のすべての答えが示唆するように、-mを使用してsqlserverのインスタンスを起動する必要があります。ただし、Microsoftでは、もう少し詳細な手順を提供しています。

[スタート]ページから、SQL Server Management Studioを起動します。 [表示]メニューで、[登録済みサーバー]を選択します。 (サーバーがまだ登録されていない場合は、[ローカルサーバーグループ]を右クリックし、[タスク]をポイントして、[ローカルサーバーの登録]をクリックします。)

[登録済みサーバー]領域で、サーバーを右クリックし、[SQL Server構成マネージャー]をクリックします。これにより、管理者として実行する許可が求められ、Configuration Managerプログラムが開きます。

Management Studioを閉じます。

SQL Server構成マネージャーの左側のウィンドウで、[SQL Serverサービス]を選択します。右側のペインで、SQL Serverのインスタンスを見つけます。 (SQL Serverの既定のインスタンスには、コンピューター名の後に(MSSQLSERVER)が含まれます。名前付きインスタンスは、登録済みサーバーと同じ名前で大文字で表示されます。)SQL Serverのインスタンスを右クリックし、[プロパティ]をクリックします。

[スタートアップパラメータ]タブの[スタートアップパラメータの指定]ボックスに-mと入力し、[追加]をクリックします。 (これはダッシュで、小文字のmです。)

注意

SQL Serverの以前のバージョンには、[スタートアップパラメータ]タブがありません。その場合、[詳細設定]タブで、[スタートアップパラメーター]をダブルクリックします。パラメータは非常に小さなウィンドウで開きます。既存のパラメーターを変更しないように注意してください。最後に、新しいパラメーター; -mを追加し、[OK]をクリックします。 (つまり、セミコロン、ダッシュ、小文字のmです。)

[OK]をクリックし、再起動するメッセージの後に、サーバー名を右クリックして、[再起動]をクリックします。

SQL Serverの再起動後、サーバーはシングルユーザーモードになります。 SQL Serverエージェントが実行されていないことを確認してください。開始された場合、唯一の接続が必要になります。

Windows 8の開始画面で、Management Studioのアイコンを右クリックします。画面の下部で、[管理者として実行]を選択します。 (これにより、管理者の資格情報がSSMSに渡されます。)

注意

Windowsの以前のバージョンでは、[管理者として実行]オプションがサブメニューとして表示されます。

一部の構成では、SSMSは複数の接続を試行します。 SQL Serverはシングルユーザーモードであるため、複数の接続は失敗します。実行する次のアクションのいずれかを選択できます。次のいずれかを実行します。

a)Windows認証(管理者の資格情報を含む)を使用してオブジェクトエクスプローラーに接続します。 [セキュリティ]、[ログイン]の順に展開し、独自のログインをダブルクリックします。 [サーバーの役割]ページで[sysadmin]を選択し、[OK]をクリックします。

b)オブジェクトエクスプローラーに接続する代わりに、Windows認証(管理者の資格情報を含む)を使用してクエリウィンドウに接続します。 (この方法で接続できるのは、オブジェクトエクスプローラーで接続しなかった場合のみです。)次のようなコードを実行して、sysadmin固定サーバーロールのメンバーである新しいWindows認証ログインを追加します。次の例では、CONTOSO\PatKという名前のドメインユーザーを追加します。

CREATE LOGIN [CONTOSO\PatK] FROM WINDOWS;   ALTER SERVER ROLE
sysadmin ADD MEMBER [CONTOSO\PatK];   

c)SQL Serverが混合認証モードで実行されている場合は、Windows認証(管理者の資格情報を含む)を使用してクエリウィンドウに接続します。次のようなコードを実行して、sysadmin固定サーバーロールのメンバーである新しいSQL Server認証ログインを作成します。

CREATE LOGIN TempLogin WITH PASSWORD = '************';   ALTER
SERVER ROLE sysadmin ADD MEMBER TempLogin;   

警告:

************を強力なパスワードに置き換えます。

d)SQL Serverが混合認証モードで実行されており、saアカウントのパスワードをリセットする場合は、Windows認証(管理者の資格情報を含む)を使用してクエリウィンドウに接続します。次の構文でsaアカウントのパスワードを変更します。

ALTER LOGIN sa WITH PASSWORD = '************';   Warning

************を強力なパスワードに置き換えます。

次の手順により、SQL Serverがマルチユーザーモードに戻ります。 SSMSを閉じます。

SQL Server構成マネージャーの左側のウィンドウで、[SQL Serverサービス]を選択します。右ペインで、SQL Serverのインスタンスを右クリックし、[プロパティ]をクリックします。

[スタートアップパラメータ]タブの[既存のパラメータ]ボックスで、-mを選択し、[削除]をクリックします。

注意

SQL Serverの以前のバージョンには、[スタートアップパラメータ]タブがありません。その場合、[詳細設定]タブで、[スタートアップパラメーター]をダブルクリックします。パラメータは非常に小さなウィンドウで開きます。先に追加した; -mを削除し、[OK]をクリックします。

サーバー名を右クリックし、[再起動]をクリックします。

これで、sysadmin固定サーバーロールのメンバーであるアカウントの1つに通常接続できるようになります。

4

実際には、-mをSql Server Configuration Managerの起動パラメーターに追加し、サービスを再起動し、ssmsに移動してアカウントのsysadminチェックボックスを追加し、-m restartを削除して通常どおり使用します。

データベースエンジンサービスの起動オプション

-mシングルユーザーモードでSQL Serverのインスタンスを起動します。

2