2012-03-27 1 views
62

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

"CREATE DATABASE Permission Denied"

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

"Пользователь не имеет разрешения на выполнение этого действия."

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

+0

Вы пытаетесь подключиться через проверку подлинности SQL Server или проверку подлинности Windows? –

+0

Проверка подлинности Windows (см. Заголовок). Я успешно соединяюсь. Ошибки возникают при попытке выполнить задачи администратора. – SkonJeet

ответ

49

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

Редактировать: Измененная dead link ссылка на archive.org. Исходный пост here

+6

Это не дыра в безопасности, локальные администраторы должны иметь права на sql-сервер, на самом деле локальный администратор в любом случае сможет получить доступ к данным сервера sql, скопировав файлы данных на другой компьютер (а затем, при необходимости, скопировав их) поэтому ваш единственный способ обойти это - ограничить административные разрешения только тем, кто этого заслуживает. –

+0

ЧТО должно быть проще, чем удалить/переустановить? Едва! В моем случае мы были перенесены в другой домен; все существующие логины бесполезны. – dudeNumber4

+2

Ссылка мертва (и ссылки только ответы обескуражены). http://stackoverflow.com/a/9889484/389424 имеет те же инструкции, что и исходное сообщение в блоге – janv8000

35

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

Source.

+1

Спасибо Даррен, высоко оценил. – SkonJeet

+0

Быстро заметите, что sp_addsrvrolemember был заменен на 'ALTER SERVER ROLE'. например 'ALTER SERVER ROLE [sysadmin] ADD MEMBER [domain \ username]' – Fermin

28

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

Get admin rights to your local SQL Server Express with this simple script

Download link to the script

Описание

Эта команда скрипт позволяет легко добавить себя в сисадмин роли локального экземпляра 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 с «Instance Name» (Вероятно, будет «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 Server Script Host», иначе этот вуду не будет работать (у меня был сопоставлен файл notepad.exe). –

+1

Ссылки мертвы - «Архивная галерея ушла на пенсию». – stuartd

+3

@stuartd - добавлен скрипт –

22

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

+1

Просто использовал это - сработал угощение! –

+3

Это решение сработало для меня, с одним дополнительным шагом: Пришлось запустить sql-сервер в однопользовательском режиме, добавив флаг «-m». Это можно сделать с помощью «Диспетчера конфигурации SQL Server», щелкните правой кнопкой мыши экземпляр сервера и выберите свойства, перейдите на вкладку «Параметры запуска» и добавьте -m. – maets

+0

Это потрясающе. Настолько проще, чем другие ответы. – McKay

2

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

Database Engine Service Startup Options

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