로컬 SQL Server 인스턴스에 대한 관리자 액세스 권한을 어떻게 부여합니까?


92

로컬 컴퓨터에 SQL Server 2008 R2를 설치했습니다. 그러나 권한 (또는 부족)으로 인해 새 데이터베이스를 만들 수 없습니다.

"데이터베이스 생성 권한이 거부되었습니다."

그래서 현재 로그인에 관리자 권한을 할당하려고했습니다.

"사용자에게이 작업을 수행 할 권한이 없습니다."

또한 관리자 권한이 있지만 운이없는 새 로그인을 만들려고했습니다. 데이터베이스를 만들 수 있도록 관리자 권한을 어떻게 부여합니까? 다시 설치할 수 있지만 원하지 않습니다.


1
SQL Server 인증 또는 Windows 인증을 통해 연결하려고합니까?
Darren

Windows 인증 (제목 참조). 성공적으로 연결하고 있습니다. 오류는 관리 작업을 수행하려고 할 때 발생합니다.
SkonJeet

답변:


70

예-SQL Server를 설치할 때 sysadmin 역할에 자신을 추가하는 것을 잊은 것 같습니다. 컴퓨터의 로컬 관리자 인 경우이 블로그 게시물 을 통해 SQLCMD를 사용하여 다시 설치하지 않고도 SQL Server sysadmin 그룹에 계정을 추가 할 수 있습니다. 저에게 물어 보면 SQL Server에 약간의 보안 허점이 있지만이 경우에는 도움이 될 것입니다.


15
보안 허점이 아니며 로컬 관리자는 SQL 서버에 대한 권한이 있어야합니다. 사실 로컬 관리자는 데이터 파일을 다른 컴퓨터로 복사 한 다음 필요한 경우 다시 복사하여 SQL 서버의 데이터에 액세스 할 수 있습니다. 이 문제를
해결할

제거 / 재설치보다 쉬울까요? 거의! 제 경우에는 다른 도메인으로 마이그레이션했습니다. 모든 기존 로그인은 쓸모가 없습니다.
dudeNumber4 jul.

8
링크가 끊어졌습니다 (링크 전용 답변은 권장되지 않음). stackoverflow.com/a/9889484/389424 에는 원래 블로그 게시물과 동일한 지침이 있습니다
janv8000

81

명령 프롬프트 창을 엽니 다. 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연결 (다른 명령 프롬프트 창에서) 할 수있다.

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

소스 .

UPDATED 뒤에 세미콜론을 잊지 말고 뒤에 세미콜론을 ALTER SERVER ROLE [sysadmin] ADD MEMBER [<<DOMAIN\USERNAME>>];추가하지 마십시오. 그렇지 않으면 GO명령이 실행되지 않습니다.


sp_addsrvrolemember가 ALTER SERVER ROLE. 예ALTER SERVER ROLE [sysadmin] ADD MEMBER [domain\username]
Fermin

GO;끝에 추가하는 것을 잊지 마세요
NMrt

우리 중 많은 사람들이 SSMS 없이 SQL Server 실행하고 있다는 점을 감안할 때 이것이 훨씬 더 나은 대답이라고 생각합니다.
Chaim Eliyah

38

저는 시스템 관리자가 아니라 컴퓨터의 관리자 인 SQL 2012 데이터베이스를 채택했습니다. "관리자 권한으로 실행"과 함께 SSMS를 사용하고 내 NT 계정을 SQL 로그인으로 추가하고 서버 역할을 sysadmin으로 설정했습니다. 문제 없어요.


14
이 솔루션은 한 가지 추가 단계가 필요했습니다. "-m"플래그를 추가하여 단일 사용자 모드에서 SQL Server를 시작해야했습니다. "SQL Server 구성 관리자"를 사용하여 수행 할 수 있습니다. 서버 인스턴스를 마우스 오른쪽 단추로 클릭하고 속성을 선택한 다음 "시작 매개 변수"탭으로 이동하여 -m을 추가합니다.
maets

굉장합니다. 다른 답변보다 훨씬 간단합니다.
McKay

확실히 가장 빠르고 모든 답변 중 최고
Johnny

매우 간단하고 매력처럼 작동합니다. 감사합니다 빈스와 매츠.
Edgar Salazar 2016

1
이것은 실제로 정답입니다. 단일 사용자 모드에서 SQL을 얻으려면> net stop MSSQL $ SQLEXPRESS를 실행 한 다음> net start MSSQL $ SQLEXPRESS / m
Ev를 실행해야했습니다.

29

이 문제를 해결할 수 있다고 주장하는 스크립트가 있습니다.

이 간단한 스크립트로 로컬 SQL Server Express에 대한 관리자 권한을 얻으십시오.

스크립트 링크 다운로드

기술

이 명령 스크립트를 사용하면 로컬 SQL Server 인스턴스의 sysadmin 역할에 자신을 쉽게 추가 할 수 있습니다. Windows 로컬 관리자 그룹의 구성원이거나 해당 사용자의 자격 증명에 액세스 할 수 있어야합니다. 이 스크립트는 SQL Server 2005 이상을 지원합니다.

이 스크립트는 다른 사람이 설치 한 SQL Server 2008 Express를 사용하려는 개발자에게 가장 유용합니다. 이 상황에서는 기본적으로 SQL Server 2008을 설치하는 사람에게만 관리 권한이 부여되므로 일반적으로 SQL Server 2008 Express 인스턴스에 대한 관리 권한이 없습니다.

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
나를 위해 일했습니다. 한 가지 명심해야 할 점은 .js 확장자가 매핑되어 있는지 확인하십시오. Microsoft ® Windows Based Script Host그렇지 않으면이 부두가 작동하지 않습니다 (내가 notepad.exe에 매핑했습니다).
Phil Cooper

2
링크가 죽었습니다- "아카이브 갤러리가 사용 중지되었습니다".
stuartd 2014-07-29

3
@stuartd는 - 스크립트를 추가
크리스 슬러

위의 스크립트를 사용하여 자신을 관리자로 추가하는 데 문제가있는 경우. 로그인을 데이터베이스에 추가 한 다음 스크립트를 실행하십시오.
Ram

2
누군가 이것을 GitHub에 추가했습니다. 이 스크립트는 실시간 보호기입니다. gist.github.com/wadewegner/1677788
Patrick

6

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을 추가 한 다음 확인을 클릭합니다. (세미콜론, 대시, 소문자 m)

확인을 클릭하고 다시 시작하라는 메시지 다음에 서버 이름을 마우스 오른쪽 단추로 클릭 한 다음 다시 시작을 클릭합니다.

SQL Server가 다시 시작되면 서버가 단일 사용자 모드가됩니다. SQL Server 에이전트가 실행되고 있지 않은지 확인하십시오. 시작되면 유일한 연결이 필요합니다.

Windows 8 시작 화면에서 Management Studio 아이콘을 마우스 오른쪽 버튼으로 클릭합니다. 화면 하단에서 관리자 권한으로 실행을 선택합니다. (이렇게하면 관리자 자격 증명이 SSMS로 전달됩니다.)

노트

이전 버전의 Windows에서는 관리자 권한으로 실행 옵션이 하위 메뉴로 나타납니다.

일부 구성에서 SSMS는 여러 연결을 시도합니다. SQL Server가 단일 사용자 모드이기 때문에 다중 연결이 실패합니다. 수행 할 다음 작업 중 하나를 선택할 수 있습니다. 다음 중 하나를 수행하십시오.

a) Windows 인증 (관리자 자격 증명 포함)을 사용하여 개체 탐색기에 연결합니다. 보안을 확장하고 로그인을 확장 한 다음 자신의 로그인을 두 번 클릭합니다. 서버 역할 페이지에서 sysadmin을 선택한 다음 확인을 클릭합니다.

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을 제거한 다음 확인을 클릭합니다.

서버 이름을 마우스 오른쪽 단추로 클릭 한 다음 다시 시작을 클릭합니다.

이제 sysadmin 고정 서버 역할의 구성원 인 계정 중 하나와 정상적으로 연결할 수 있습니다.


2

실제로 Sql Server Configuration Manager의 시작 매개 변수에 -m을 추가하고 서비스를 다시 시작하고 ssms로 이동하여 계정의 sysadmin 추가 확인란을 선택한 다음 -m restart를 다시 제거하고 평소대로 사용하면 충분합니다.

데이터베이스 엔진 서비스 시작 옵션

-m 단일 사용자 모드에서 SQL Server 인스턴스를 시작합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.