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

Sko*_*eet 88 ssms sqlcmd sql-server-2008

我将SQL Server 2008 R2安装到本地计算机上.但是,由于权利(或缺乏),我无法创建新的数据库.

"创建DATEABASE PERMISSION DENIED"

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

"用户无权执行此操作."

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

Dar*_*ren 71

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

net stop mssqlserver
Run Code Online (Sandbox Code Playgroud)

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

C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn
C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn
Run Code Online (Sandbox Code Playgroud)

找出你的MSSQL目录并将其CD放入其中:

CD C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn
Run Code Online (Sandbox Code Playgroud)

现在运行以下命令以单用户模式启动SQL Server.按照 SQLCMD规定,只能建立一个SQLCMD连接(来自另一个命令提示符窗口).

sqlservr -m"SQLCMD"
Run Code Online (Sandbox Code Playgroud)

现在,打开另一个命令提示符窗口,作为与上面以单用户模式启动SQL Server的用户相同的用户,并在其中运行:

sqlcmd
Run Code Online (Sandbox Code Playgroud)

然后按Enter键.现在,您可以针对以单用户模式运行的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
Run Code Online (Sandbox Code Playgroud)

来源.

更新 不要忘记分号后ALTER SERVER ROLE [sysadmin] ADD MEMBER [<<DOMAIN\USERNAME>>];,不要添加额外的分号GO或命令永远不会执行.

  • 请注意,sp_addsrvrolemember 已被“ALTER SERVER ROLE”取代。例如`ALTER SERVER ROLE [sysadmin] ADD MEMBER [domain\username]` (2认同)
  • 鉴于我们中的许多人现在都在不使用 SSMS 的情况下运行 SQL Server,我觉得这是一个更好的答案。 (2认同)

Bri*_*ght 66

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

编辑:更改了死链接以指向archive.org.原帖在这里

  • 它不是安全漏洞,本地管理员需要拥有sql server的权限,实际上本地管理员无论如何都能通过将数据文件复制到另一台机器来访问sql server的数据(然后根据需要复制回来),所以你唯一的办法是将管理权限限制在那些值得拥有它的人身上. (10认同)
  • 链接已死(并且不鼓励仅链接答案).http://stackoverflow.com/a/9889484/389424与原始博客文章具有相同的说明 (6认同)

小智 33

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

  • 这个解决方案对我有用,还需要一个额外的步骤:必须通过添加"-m"标志以单用户模式启动sql server.这可以使用"SQL Server配置管理器"完成,右键单击服务器实例并选择属性,转到"启动参数"选项卡并添加-m. (9认同)
  • 刚用过这个 - 工作了一顿! (2认同)

Chr*_*ler 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
Run Code Online (Sandbox Code Playgroud)

然后复制结果以在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
Run Code Online (Sandbox Code Playgroud)

  • @stuartd - 添加了脚本 (3认同)
  • 为我工作.有一点需要注意,请确保将.js扩展名映射到"Microsoft®WindowsBased Script Host",否则此voodoo将无效(我已将其映射到notepad.exe). (2认同)
  • 链接已死 - “档案库已停用”。 (2认同)
  • 有人把这个添加到GitHub.这个脚本是一个真正的节省时间.https://gist.github.com/wadewegner/1677788 (2认同)

Yai*_*adt 7

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 配置管理器”。这应该请求以管理员身份运行的权限,然后打开 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 处于单用户模式。您可以选择以下操作之一来执行。执行以下操作之一。

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

b) 不使用对象资源管理器连接,而是使用 Windows 身份验证(包括您的管理员凭据)连接查询窗口。(如果没有使用对象资源管理器连接,则只能以这种方式连接。)执行如下代码以添加新的 Windows 身份验证登录,该登录是 sysadmin 固定服务器角色的成员。以下示例添加名为 CONTOSO\PatK 的域用户。

CREATE LOGIN [CONTOSO\PatK] FROM WINDOWS;   ALTER SERVER ROLE
sysadmin ADD MEMBER [CONTOSO\PatK];   
Run Code Online (Sandbox Code Playgroud)

c) 如果您的 SQL Server 在混合身份验证模式下运行,请使用 Windows 身份验证(包括您的管理员凭据)连接查询窗口。执行如下代码以创建一个新的 SQL Server 身份验证登录名,该登录名是 sysadmin 固定服务器角色的成员。

CREATE LOGIN TempLogin WITH PASSWORD = '************';   ALTER
SERVER ROLE sysadmin ADD MEMBER TempLogin;   
Run Code Online (Sandbox Code Playgroud)

警告:

用强密码替换 ************。

d) 如果您的 SQL Server 在混合身份验证模式下运行并且您想要重置 sa 帐户的密码,请使用 Windows 身份验证(包括您的管理员凭据)连接查询窗口。使用以下语法更改 sa 帐户的密码。

ALTER LOGIN sa WITH PASSWORD = '************';   Warning
Run Code Online (Sandbox Code Playgroud)

用强密码替换 ************。

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

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

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

笔记

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

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

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