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

时间:2012-03-27 12:13:45

标签: sql-server-2008 ssms sqlcmd

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

  

“创建DATEABASE PERMISSION DENIED”

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

  

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

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

6 个答案:

答案 0 :(得分:65)

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

答案 1 :(得分:63)

打开命令提示符窗口。如果您已运行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 [<<DOMAIN\USERNAME>>];之后的分号,并且在GO之后不添加额外的分号或者命令永远不会执行。

答案 2 :(得分:30)

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

答案 3 :(得分:29)

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

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

Download link to the script

  

说明

     

此命令脚本允许您轻松地将自己添加到sysadmin   本地SQL Server实例的角色。你必须是该会员   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”中运行以下内容来获取值服务器管理控制台“:

 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

答案 4 :(得分:4)

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

     

关闭Management Studio。

     

在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身份验证连接到对象资源管理器(   包括您的管理员凭据)。展开安全性,展开   登录,然后双击您自己的登录名。在“服务器角色”页面上,   选择sysadmin,然后单击“确定”。

     

b)不使用对象资源管理器连接,而是使用查询进行连接   使用Windows身份验证的窗口(包括您的管理员)   证书)。 (如果没有连接,您只能以这种方式连接   使用对象资源管理器。)执行以下代码添加新代码   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帐户的密码,请使用Query进行连接   使用Windows身份验证的窗口(包括您的管理员)   证书)。使用以下内容更改sa帐户的密码   语法。

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

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

     

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

     

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

     

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

     

请注意

     

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

     

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

     

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

答案 5 :(得分:2)

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

Database Engine Service Startup Options

  

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