Как предоставить себе административный доступ к локальному экземпляру SQL Server?

94

Я установил SQL Server 2008 R2 на свой локальный компьютер. Но я не могу создать новую базу данных из-за прав (или их отсутствия).

"РАЗРЕШЕНИЕ НА СОЗДАНИЕ БАЗЫ ДАННЫХ ОТКАЗАНО"

Итак, я попытался назначить права администратора моему текущему логину

«У пользователя нет разрешения на выполнение этого действия».

Я также попытался создать новый логин с правами администратора, но безуспешно. Как мне предоставить права администратора, чтобы я мог создать базу данных? Я могу переустановить, но предпочитаю этого не делать.

SkonJeet
источник
1
Вы пытаетесь подключиться через аутентификацию SQL Server или Windows?
Даррен
Аутентификация Windows (см. Заголовок). Я успешно подключаюсь. Ошибки возникают при попытке выполнить задачи администратора.
SkonJeet

Ответы:

70

Да - похоже, вы забыли добавить себя к роли sysadmin при установке SQL Server. Если вы являетесь локальным администратором на своем компьютере, это сообщение в блоге может помочь вам использовать SQLCMD для включения вашей учетной записи в группу системных администраторов SQL Server без необходимости переустановки. Если вы спросите меня, это небольшая дыра в безопасности SQL Server, но в этом случае она вам поможет.

Брайан Найт
источник
15
Это не дыра в безопасности, локальные администраторы должны иметь права на sql-сервер, на самом деле локальный администратор в любом случае сможет получить доступ к данным sql-сервера, скопировав файлы данных на другой компьютер (а затем, при необходимости, скопировав обратно), поэтому единственный способ обойти это - ограничить административные права только теми, кто этого заслуживает ..
йоэль халб
ЭТО должно быть проще, чем удалить / переустановить? Едва! В моем случае нас перевели в другой домен; все существующие логины бесполезны.
dudeNumber4
8
Ссылка мертва (и ответы только по ссылке не приветствуются). stackoverflow.com/a/9889484/389424 содержит те же инструкции, что и исходное сообщение в блоге
janv8000
82

Откройте окно командной строки. Если у вас уже запущен экземпляр 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

И нажмите ввод. Теперь вы можете выполнять операторы SQL для экземпляра SQL Server, работающего в однопользовательском режиме:

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]
Fermin
Не забудьте добавить GO;в конце
NMrt
Учитывая, что многие из нас сейчас используют SQL Server без SSMS, я считаю, что это гораздо лучший ответ.
Хаим Элия
39

Я принял базу данных SQL 2012, в которой я не был системным администратором, а был администратором на машине. Я использовал SSMS с «Запуском от имени администратора», добавил мою учетную запись NT в качестве имени входа SQL и установил роль сервера как sysadmin. Нет проблем.

Винс П.
источник
14
Это решение сработало для меня, и потребовался один дополнительный шаг: пришлось запустить sql-сервер в однопользовательском режиме, добавив флаг «-m». Это можно сделать с помощью «Диспетчера конфигурации SQL Server», щелкните правой кнопкой мыши экземпляр сервера и выберите свойства, перейдите на вкладку «Параметры запуска» и добавьте -m.
2015,
Это круто. Намного проще, чем другие ответы.
McKay
1
Определенно самый быстрый и лучший из ответов
Джонни
Довольно просто и прекрасно работает. Спасибо Винсу и маец.
Эдгар Салазар
1
На самом деле это правильный ответ. Одно замечание: чтобы получить SQL в однопользовательском режиме, мне пришлось запустить> net stop MSSQL $ SQLEXPRESS, а затем> net start MSSQL $ SQLEXPRESS / m
Ev.
29

Вот сценарий, который утверждает, что может это исправить.

Получите права администратора на локальном SQL Server Express с помощью этого простого скрипта

Ссылка на скачивание скрипта

Описание

Этот командный сценарий позволяет легко добавить себя к роли системного администратора локального экземпляра SQL Server. Вы должны быть членом локальной группы администраторов Windows или иметь доступ к учетным данным пользователя. Скрипт поддерживает 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 Management Console» ":

 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).
Фил Купер
2
Ссылки мертвы - «Архивная галерея удалена».
stuartd
3
@stuartd - добавлен сценарий
Крис Гесслер
если вы столкнулись с проблемой добавления себя в качестве администратора, используя приведенный выше сценарий. Попробуйте добавить свой логин в базу данных, а затем запустите сценарий.
Ram
2
Кто-то добавил это на GitHub. Этот сценарий очень экономит время. gist.github.com/wadewegner/1677788
Патрик,
6

У Microsoft есть статья об этой проблеме. Все это проходит шаг за шагом.

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

Короче говоря, это включает в себя запуск экземпляра sqlserver, -mкак и все другие ответы. Однако 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.)

Нажмите OK, а после сообщения о перезапуске щелкните правой кнопкой мыши имя сервера и выберите «Перезагрузить».

После перезапуска SQL Server ваш сервер будет в однопользовательском режиме. Убедитесь, что агент SQL Server не запущен. Если запущено, потребуется ваше единственное соединение.

На начальном экране Windows 8 щелкните правой кнопкой мыши значок Management Studio. Внизу экрана выберите Запуск от имени администратора. (Это передаст ваши учетные данные администратора в SSMS.)

Заметка

Для более ранних версий Windows параметр «Запуск от имени администратора» отображается в виде подменю.

В некоторых конфигурациях SSMS попытается установить несколько подключений. Несколько подключений не будут выполнены, потому что SQL Server находится в однопользовательском режиме. Вы можете выбрать одно из следующих действий для выполнения. Выполните одно из следующих действий.

a) Подключитесь к обозревателю объектов с помощью проверки подлинности Windows (включая учетные данные администратора). Разверните Безопасность, разверните Имена входа и дважды щелкните свой логин. На странице «Роли сервера» выберите системный администратор и нажмите кнопку «ОК».

б) Вместо подключения к обозревателю объектов подключитесь к окну запроса, используя проверку подлинности Windows (которая включает ваши учетные данные администратора). (Вы можете подключиться таким образом только в том случае, если вы не подключились с помощью обозревателя объектов.) Выполните следующий код, чтобы добавить новую учетную запись для проверки подлинности Windows, которая является членом фиксированной роли сервера sysadmin. В следующем примере добавляется пользователь домена с именем CONTOSO \ PatK.

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

c) Если ваш SQL Server работает в смешанном режиме проверки подлинности, подключитесь к окну запроса, используя проверку подлинности Windows (которая включает ваши учетные данные администратора). Выполните следующий код, чтобы создать новое имя входа для проверки подлинности SQL Server, которое является членом фиксированной серверной роли sysadmin.

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.

Яир Хальберштадт
источник
2

На самом деле достаточно добавить -m к параметрам запуска в Sql Server Configuration Manager, перезапустить службу, перейти к ssms, добавить флажок sysadmin в вашей учетной записи, затем снова удалить -m restart и использовать как обычно.

Параметры запуска службы ядра СУБД

-m Запускает экземпляр SQL Server в однопользовательском режиме.

norbertas.gaulia
источник