如何授予自己对本地SQL Server实例的管理员访问权限?


92

我在本地计算机上安装了SQL Server 2008 R2。但是,由于权限(或缺少权限),我无法创建新数据库。

“创建数据库权限被拒绝”

因此,我尝试将管理员权限分配给当前登录名

“用户无权执行此操作。”

我还尝试创建一个具有管理员权限但没有运气的新登录名。如何授予自己管理员权限,以便创建数据库?我可以重新安装,但我不愿意。


1
您是否要通过SQL Server身份验证或Windows身份验证进行连接?
达伦(Darren)2012年

Windows身份验证(请参见标题)。我连接成功。错误来自尝试执行管理任务。
SkonJeet 2012年

Answers:


70

是的-似乎您忘记了在安装SQL Server时将自己添加到sysadmin角色中。如果您是计算机的本地管理员,则此博客文章可以帮助您使用SQLCMD将您的帐户添加到SQL Server sysadmin组中,而不必重新安装。如果您问我,这在SQL Server中有一个安全漏洞,但是在这种情况下,它将为您提供帮助。


15
这不是一个安全漏洞,本地管理员需要拥有sql服务器的权限,实际上,本地管理员无论如何都可以通过将数据文件复制到另一台计算机(然后在需要时进行复制)来访问sql服务器的数据。你解决这个唯一的办法就是管理权限只限制谁活该的那些..
约尔HALB

那应该比卸载/重新安装更容易?几乎不!就我而言,我们已迁移到另一个域;现有的所有登录信息一文不值。
dudeNumber4 2015年

8
链接无效(不鼓励仅链接的答案)。stackoverflow.com/a/9889484/389424具有与原始博客文章相同的说明
janv8000

81

打开命令提示符窗口。如果您已经在运行SQL Server的默认实例,请在命令提示符处运行以下命令以停止SQL Server服务:

net stop mssqlserver

现在转到安装SQL Server的目录。该目录例如可以是以下之一:

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 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_addsrvrolelemember已由取代ALTER SERVER ROLE。例如ALTER SERVER ROLE [sysadmin] ADD MEMBER [domain\username]
Fermin

不要忘了GO;在末尾添加
NMrt

鉴于我们许多人现在都在运行没有 SSMS的SQL Server ,我觉得这是一个更好的答案。
Chaim Eliyah

38

我采用了SQL 2012数据库,在该数据库中,我不是sysadmin,而是计算机的管理员。我将SSMS与“以管理员身份运行”一起使用,将我的NT帐户添加为SQL登录名,并将服务器角色设置为sysadmin。没问题。


14
该解决方案为我工作,需要执行一个附加步骤:必须通过添加“ -m”标志以单用户模式启动sql服务器。这可以使用“ SQL Server配置管理器”来完成,右键单击服务器实例并选择属性,转到“启动参数”选项卡并添加-m。
2015年

这太棒了。比其他答案要简单得多。
麦凯2015年

绝对最快,最好的答案
约翰尼

非常简单明了,就像魅力一样。感谢文斯和女仆。
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
为我工作。请记住一件事,请确保将.js扩展名映射到Microsoft ® Windows Based Script Host否则该巫毒教徒将无法工作(我已将我的映射到notepad.exe)。
Phil Cooper

2
链接已失效-“存档库已淘汰”。
stuartd 2014年

3
@stuartd-添加了脚本
Chris Gessler

如果您遇到使用上述脚本将自己添加为管理员的问题。尝试将登录名添加到数据库,然后运行脚本。
2016年

2
有人将此添加到GitHub。该脚本是一个实时保护程序。gist.github.com/wadewegner/1677788
Patrick

6

Microsoft有一篇有关此问题的文章。它一步一步地进行着。

https://docs.microsoft.com/zh-cn/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,然后单击“确定”。(这是一个分号,然后是一个破折号然后是小写字母m。)

单击“确定”,然后在消息重新启动后,右键单击您的服务器名称,然后单击“重新启动”。

SQL Server重新启动后,您的服务器将进入单用户模式。确保该SQL Server代理未运行。如果启动,它将连接您唯一的连接。

在Windows 8的开始屏幕上,右键单击Management Studio的图标。在屏幕底部,选择“以管理员身份运行”。(这会将您的管理员凭据传递给SSMS。)

注意

对于Windows的早期版本,“以管理员身份运行”选项显示为子菜单。

在某些配置中,SSMS将尝试建立多个连接。由于SQL Server处于单用户模式,因此多个连接将失败。您可以选择以下操作之一来执行。请执行以下任一操作。

a)使用Windows身份验证(包括您的管理员凭据)与Object Explorer连接。展开安全性,展开登录名,然后双击您自己的登录名。在“服务器角色”页面上,选择“ sysadmin”,然后单击“确定”。

b)使用Windows身份验证(包括管理员凭据)连接到查询窗口,而不是与Object Explorer连接。(如果未与Object Explorer连接,则只能以这种方式连接。)执行如下代码,以添加新的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,然后单击“确定”。

用鼠标右键单击您的服务器名称,然后单击重新启动。

现在,您应该能够正常连接其中一个帐户,该帐户现在是sysadmin固定服务器角色的成员。


2

它实际上足以将-m添加到Sql Server配置管理器上的启动参数,重新启动服务,转到ssms并在您的帐户上添加添加复选框sysadmin,然后再次删除-m重新启动并照常使用。

数据库引擎服务启动选项

-m以单用户模式启动SQL Server的实例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.