【问题标题】:How do I grant myself admin access to a local SQL Server instance?如何授予自己对本地 SQL Server 实例的管理员访问权限?
【发布时间】:2012-03-27 12:13:44
【问题描述】:

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

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

所以,我尝试将管理员权限分配给我当前的登录名

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

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

【问题讨论】:

  • 您是尝试通过 SQL Server 身份验证还是 Windows 身份验证进行连接?
  • Windows 身份验证(见标题)。我连接成功。错误来自尝试执行管理任务。

标签: sql sql-server sql-server-2008 ssms sqlcmd


【解决方案1】:

打开命令提示符窗口。如果您已经运行了 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

Source.

更新 不要忘记ALTER SERVER ROLE [sysadmin] ADD MEMBER [&lt;&lt;DOMAIN\USERNAME&gt;&gt;]; 之后的分号,并且不要在GO 之后添加额外的分号,否则命令永远不会执行。

【讨论】:

  • 快速注意 sp_addsrvrolemember 已被 ALTER SERVER ROLE 取代。例如ALTER SERVER ROLE [sysadmin] ADD MEMBER [domain\username]
  • 别忘了在最后加上GO;
  • 鉴于我们中的许多人现在都在运行 SQL Server没有 SSMS,我觉得这是一个更好的答案。
  • 感谢您,不要忘记使用“net start mssqlserver”或 SQL Server 配置管理启动服务。
【解决方案2】:

是的 - 在安装 SQL Server 时,您似乎忘记将自己添加到系统管理员角色。如果您是计算机上的本地管理员,this blog post 可以帮助您使用 SQLCMD 将您的帐户加入 SQL Server sysadmin 组,而无需重新安装。如果你问我,这在 SQL Server 中有点安全漏洞,但在这种情况下它会帮助你。

【讨论】:

  • 这不是一个安全漏洞,本地管理员需要拥有对 sql server 的权限,实际上本地管理员无论如何都可以通过将数据文件复制到另一台机器来访问 sql server 的数据(并且然后在需要时复制回来),因此您解决此问题的唯一方法是将管理权限仅限于应得的人..
  • 这应该比卸载/重新安装更容易?几乎不!就我而言,我们被迁移到另一个域;所有现有的登录都一文不值。
  • 链接已失效(不鼓励仅链接的答案)。 stackoverflow.com/a/9889484/389424 说明与原博文相同
  • @yoelhalb 我会恭敬地但坚决不同意你的观点。本地管理员不应拥有对 SQL Server 的管理员访问权限。
【解决方案3】:

我采用了一个 SQL 2012 数据库,我不是系统管理员,而是机器上的管理员。我使用带有“以管理员身份运行”的 SSMS,将我的 NT 帐户添加为 SQL 登录名,并将服务器角色设置为 sysadmin。没问题。

【讨论】:

  • 这个解决方案对我有用,还需要一个额外的步骤:必须通过添加“-m”标志以单用户模式启动 sql server。这可以使用“SQL Server 配置管理器”来完成,右键单击服务器实例并选择属性,转到选项卡“启动参数”并添加 -m。
  • 这太棒了。比其他答案简单得多。
  • 绝对是最快最好的答案
  • 非常简单,就像一个魅力。谢谢文斯和梅茨。
  • 这其实是正确的答案。注意,要在单用户模式下获取 SQL,我必须运行 >net stop MSSQL$SQLEXPRESS 然后 >net start MSSQL$SQLEXPRESS /m
【解决方案4】:

这是一个声称能够解决此问题的脚本。

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 文件提供一个“实例名称”(可能是“MSSQLSERVER”,但可能不是):您可以通过首先在“Microsoft SQL服务器管理控制台”:

 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

【讨论】:

  • 为我工作。需要记住的一件事是,确保将 .js 扩展名映射到 Microsoft ® Windows Based Script Host,否则这个巫术将不起作用(我已将我的映射到 notepad.exe)。
  • 链接已失效 - “存档库已停用”。
  • @stuartd - 添加脚本
  • 如果您在使用上述脚本将自己添加为管理员时遇到问题。尝试将您的登录名添加到数据库,然后运行脚本。
  • 有人将此添加到 GitHub。这个脚本是实时的。 gist.github.com/wadewegner/1677788
【解决方案5】:

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 配置管理器。这应该征求许可 以管理员身份运行,然后打开配置管理器 程序。

关闭管理工作室。

在 SQL Server 配置管理器的左侧窗格中,选择 SQL 服务器服务。在右窗格中,找到您的 SQL Server 实例。 (SQL Server 的默认实例包括 (MSSQLSERVER) 计算机名称。命名实例以大写形式出现,同名 他们在注册服务器中拥有的。)右键单击 SQL 的实例 服务器,然后单击属性。

在“启动参数”选项卡的“指定启动参数”框中, 键入 -m,然后单击添加。 (这是一个破折号,然后是小写字母 m。)

注意

对于某些早期版本的 SQL Server,没有启动参数 标签。在这种情况下,在高级选项卡上,双击启动 参数。参数在一个非常小的窗口中打开。当心 不要更改任何现有参数。在最后,添加一个 新参数 ;-m 然后单击确定。 (这是一个分号,然后是一个破折号 然后是小写字母m。)

点击确定,出现重启消息后,右键点击你的服务器 名称,然后单击重新启动。

在 SQL Server 重新启动后,您的服务器将处于单用户状态 模式。确保该 SQL Server 代理未运行。如果开始, 这将需要您唯一的连接。

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

注意

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

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

a) 使用 Windows 身份验证与对象资源管理器连接(其中 包括您的管理员凭据)。展开安全,展开 登录,然后双击您自己的登录。在服务器角色页面上, 选择系统管理员,然后单击确定。

b) 不是使用对象资源管理器连接,而是使用查询连接 使用 Windows 身份验证的窗口(包括您的管理员 证书)。 (没有连接就只能这样连接 使用对象资源管理器。)执行如下代码以添加新的 作为系统管理员成员的 Windows 身份验证登录已修复 服务器角色。以下示例添加了一个名为的域用户 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账户的密码,用Query连接 使用 Windows 身份验证的窗口(包括您的管理员 证书)。使用以下内容更改sa帐户的密码 语法。

ALTER LOGIN sa WITH PASSWORD = '************';   Warning

将 ************ 替换为强密码。

以下步骤现在将 SQL Server 更改回多用户模式。 关闭 SSMS。

在 SQL Server 配置管理器的左侧窗格中,选择 SQL 服务器服务。在右窗格中,右键单击 SQL 实例 服务器,然后单击属性。

在启动参数选项卡的现有参数框中,选择 -m 然后点击删除。

注意

对于某些早期版本的 SQL Server,没有启动参数 标签。在这种情况下,在高级选项卡上,双击启动 参数。参数在一个非常小的窗口中打开。去除那个 ;-m 之前添加的,然后点击确定。

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

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

【讨论】:

    【解决方案6】:

    实际上在Sql Server配置管理器的启动参数中添加-m就足够了,重启服务,去ssms添加你账户上的复选框sysadmin,然后再次删除-m restart并照常使用。

    Database Engine Service Startup Options

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-12
      • 2012-03-15
      • 1970-01-01
      • 2015-06-19
      • 2019-09-17
      • 2011-11-28
      • 2020-12-11
      • 1970-01-01
      相关资源
      最近更新 更多