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


92

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

"CREATE DATABASE PERMISSION DENIED"

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

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

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


1
SQL Server認証またはWindows認証を介して接続しようとしていますか?
Darren

Windows認証(タイトルを参照)。正常に接続しています。エラーは、管理タスクを実行しようとしたことが原因です。
SkonJeet

回答:


70

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


15
これはセキュリティホールではありません。ローカル管理者はsqlサーバーへの権限を持っている必要があります。実際、ローカル管理者はデータファイルを別のマシンにコピーして(必要に応じてコピーして戻すことにより)sqlサーバーのデータにアクセスできます。これを回避する唯一の方法は、それに値するものに管理者権限を制限することです。..
ヨエルHALB

それはアンインストール/再インストールよりも簡単であるはずですか?ほとんどない!私の場合、別のドメインに移行されました。価値のない既存のすべてのログイン。
dudeNumber4 2015

8
リンクが停止しています(リンクのみの回答はお勧めしません)。stackoverflow.com/a/9889484/389424には、元のブログ投稿と同じ手順があります
janv8000

80

コマンドプロンプトウィンドウを開きます。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、コマンドが実行されません。


sp_addsrvrolememberはに置き換えられましたALTER SERVER ROLE。例ALTER SERVER ROLE [sysadmin] ADD MEMBER [domain\username]
フェルミン2017年

GO;最後にを追加することを忘れないでください
NMrt

私たちの多くがSSMS なしで SQL Server 実行していることを考えると、これははるかに良い答えだと思います。
Chaim Eliyah

38

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


14
このソリューションは私にとっては機能しましたが、1つの追加の手順が必要でした。 "-m"フラグを追加して、SQL Serverをシングルユーザーモードで起動する必要がありました。これは、 "SQL Server構成マネージャー"を使用して実行できます。サーバーインスタンスを右クリックしてプロパティを選択し、[スタートアップパラメーター]タブに移動して-mを追加します。
maets

これは素晴らしいです。他の答えよりもはるかに単純です。
マッケイ

間違いなく最も速く、すべての回答の中で最高
ジョニー

かなり簡単で、魅力のように動作します。Vinceとmaetsに感謝します。
Edgar Salazar

1
これが正解です。シングルユーザーモードでSQLを取得するには、> net stop MSSQL $ SQLEXPRESSを実行してから、> net start MSSQL $ SQLEXPRESS / m
Evを実行する必要がありました。

29

これを修正できると主張するスクリプトは次のとおりです。

この簡単なスクリプトでローカル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

2
私のために働いた。覚えておくべきことの1つは、.js拡張子がMicrosoft ® Windows Based Script Host他の場所にマッピングされていることを確認してください。
Phil Cooper

2
リンクは無効です-「アーカイブギャラリーは廃止されました」。
stuartd '29 / 07/29

3
@stuartd-スクリプトを追加
Chris Gessler

上記のスクリプトを使用して管理者として自分を追加する問題に直面している場合。ログインをデータベースに追加してから、スクリプトを実行してください。
Ram

2
誰かがこれをGitHubに追加しました。このスクリプトは、リアルタイムの節約になります。gist.github.com/wadewegner/1677788
Patrick

6

マイクロソフトには、この問題に関する記事があります。それはすべて一歩一歩それを通過します。

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つに通常どおり接続できるはずです。


2

SQL Server構成マネージャーの起動パラメーターに-mを追加し、サービスを再起動して、アカウントのssmsにある追加チェックボックスsysadminに移動してから、もう一度-m restartを削除して、通常どおり使用します。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.