我在本地计算机上安装了SQL Server 2008 R2。但是,由于权限(或缺少权限),我无法创建新数据库。
“创建数据库权限被拒绝”
因此,我尝试将管理员权限分配给当前登录名
“用户无权执行此操作。”
我还尝试创建一个具有管理员权限但没有运气的新登录名。如何授予自己管理员权限,以便创建数据库?我可以重新安装,但我不愿意。
我在本地计算机上安装了SQL Server 2008 R2。但是,由于权限(或缺少权限),我无法创建新数据库。
“创建数据库权限被拒绝”
因此,我尝试将管理员权限分配给当前登录名
“用户无权执行此操作。”
我还尝试创建一个具有管理员权限但没有运气的新登录名。如何授予自己管理员权限,以便创建数据库?我可以重新安装,但我不愿意。
Answers:
是的-似乎您忘记了在安装SQL Server时将自己添加到sysadmin角色中。如果您是计算机的本地管理员,则此博客文章可以帮助您使用SQLCMD将您的帐户添加到SQL Server sysadmin组中,而不必重新安装。如果您问我,这在SQL Server中有一个安全漏洞,但是在这种情况下,它将为您提供帮助。
打开命令提示符窗口。如果您已经在运行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
否则命令将永远不会执行。
ALTER SERVER ROLE
。例如ALTER SERVER ROLE [sysadmin] ADD MEMBER [domain\username]
GO;
在末尾添加
我采用了SQL 2012数据库,在该数据库中,我不是sysadmin,而是计算机的管理员。我将SSMS与“以管理员身份运行”一起使用,将我的NT帐户添加为SQL登录名,并将服务器角色设置为sysadmin。没问题。
这是一个声称可以解决此问题的脚本。
通过此简单脚本获得对本地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
Microsoft ® Windows Based Script Host
否则该巫毒教徒将无法工作(我已将我的映射到notepad.exe)。
Microsoft有一篇有关此问题的文章。它一步一步地进行着。
简而言之,它涉及启动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固定服务器角色的成员。
它实际上足以将-m添加到Sql Server配置管理器上的启动参数,重新启动服务,转到ssms并在您的帐户上添加添加复选框sysadmin,然后再次删除-m重新启动并照常使用。
-m以单用户模式启动SQL Server的实例。