Як надати собі доступ адміністратора до локального екземпляра SQL Server?


92

Я встановив SQL Server 2008 R2 на свою локальну машину. Але я не можу створити нову базу даних через права (або відсутність).

"СТВОРЕННЯ ДОЗВОЛЕННЯ БАЗИ ДАНИХ ВІДМОВЛЕНО"

Отже, я спробував призначити права адміністратора моєму поточному логіну

"Користувач не має дозволу виконувати цю дію."

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


1
Ви намагаєтесь підключитися за допомогою автентифікації SQL Server або автентифікації Windows?
Даррен,

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

Відповіді:


70

Так - схоже, ви забули додати себе до ролі sysadmin під час інсталяції SQL Server. Якщо ви є локальним адміністратором на своїй машині, цей допис у блозі може допомогти вам використовувати SQLCMD для переходу вашого облікового запису до групи системних адміністраторів SQL Server без необхідності переінсталювати. Якщо ви запитаєте мене, це трохи прогалина в безпеці в SQL Server, але в цьому випадку вам це допоможе.


15
Це не прогалина в безпеці, місцеві адміністратори повинні мати права на сервер sql, насправді місцевий адміністратор у будь-якому випадку зможе отримати доступ до даних сервера sql, скопіювавши файли даних на іншу машину (а потім скопіювавши назад, якщо потрібно), тому ваш єдиний спосіб обійти це обмежити адміністративні дозволи лише тим, хто цього заслуговує ..
yoel halb

ЩО має бути простіше, ніж видалити / перевстановити? Навряд чи! У моєму випадку ми перейшли на інший домен; всі існуючі логіни нічого не варті.
dudeNumber4

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 проти екземпляра 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]
Фермін

Не забудьте додати GO;в кінці
NMrt

Враховуючи, що багато хто з нас зараз працює на SQL Server без SSMS, я вважаю, що це набагато краща відповідь.
Chaim Eliyah

38

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


14
Це рішення спрацювало для мене, потрібен був один додатковий крок: Потрібно було запустити сервер sql в однокористувацькому режимі, додавши прапор "-m". Це можна зробити за допомогою «Диспетчера конфігурацій SQL Server», клацнути правою кнопкою миші екземпляр сервера та вибрати властивості, перейти на вкладку «Параметри запуску» та додати -m.
зустрічається

Це круто. Набагато простіше, ніж інші відповіді.
McKay

Безумовно, найшвидший і найкращий з усіх відповідей
Джонні

Досить просто і працює як шарм. Дякую Вінс і maets.
Едгар Салазар,

1
Це насправді правильна відповідь. Одна примітка, щоб отримати SQL в однокористувацькому режимі, мені довелося запустити> net stop MSSQL $ SQLEXPRESS, а потім> net start MSSQL $ SQLEXPRESS / m
Ev.

29

Ось сценарій, який стверджує, що може це виправити.

Отримайте права адміністратора на ваш локальний SQL Server Express за допомогою цього простого сценарію

Посилання для завантаження на сценарій

Опис

Цей сценарій команди дозволяє легко додати себе до ролі sysadmin локального екземпляра 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" ":

 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 - додав сценарій
Chris Gessler

якщо у вас виникає проблема з додаванням себе як адміністратора за допомогою вищезазначеного сценарію. Спробуйте додати свій логін до бази даних, а потім запустіть сценарій.
Рам,

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.

Закрити студію управління.

У диспетчері конфігурацій SQL Server на лівій панелі виберіть Служби SQL Server. У правій області знайдіть примірник SQL Server. (Екземпляр SQL Server за замовчуванням включає (MSSQLSERVER) після імені комп’ютера. Іменовані екземпляри з’являються у верхньому регістрі з тим самим іменем, яке вони мають у зареєстрованих серверах.) Клацніть правою кнопкою миші екземпляр SQL Server і натисніть кнопку Властивості.

На вкладці Параметри запуску у полі Вкажіть параметр запуску введіть -m, а потім натисніть Додати. (Це дефіс, а потім мала буква m.)

Примітка

У деяких попередніх версіях SQL Server немає вкладки Параметри запуску. У цьому випадку на вкладці Додатково двічі клацніть Параметри запуску. Параметри відкриваються в дуже маленькому вікні. Будьте обережні, щоб не змінити жодного з існуючих параметрів. В самому кінці додайте новий параметр; -m і натисніть кнопку OK. (Це крапка з комою, потім тире, а потім мала літера m.)

Натисніть кнопку ОК, а після повідомлення про перезапуск клацніть правою кнопкою миші ім'я сервера та натисніть кнопку Перезапустити.

Після перезапуску SQL Server ваш сервер перейде в однокористувацький режим. Переконайтеся, що агент SQL Server не запущений. Якщо почати, вам знадобиться єдине з’єднання.

На початковому екрані Windows 8 клацніть правою кнопкою миші піктограму Management Studio. Унизу екрана виберіть Запуск від імені адміністратора. (Це передасть облікові дані адміністратора службі SSMS.)

Примітка

У попередніх версіях Windows параметр Запуск від імені адміністратора відображається як підменю.

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

а) Зв’яжіться з Object Explorer за допомогою автентифікації Windows (що включає облікові дані адміністратора). Розгорніть розділ Безпека, розгорніть Логіни та двічі клацніть власний логін. На сторінці Ролі сервера виберіть sysadmin і натисніть кнопку OK.

б) Замість того, щоб підключатися до Object Explorer, підключіться до вікна запитів за допомогою автентифікації Windows (що включає облікові дані адміністратора). (Ви можете підключитися лише таким чином, якщо не підключалися до Провідника об’єктів.) Виконайте такий код, як вказаний нижче, щоб додати новий логін для автентифікації Windows, який є членом фіксованої ролі сервера sysadmin. У наступному прикладі додається користувач домену з іменем CONTOSO \ PatK.

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

в) Якщо ваш 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 add checkbox sysadmin у вашому обліковому записі, а потім знову видалити -m restart і використовувати як зазвичай.

Параметри запуску служби Database Engine

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.