SQL Server Express在数据库'master'中创建数据库的权限被拒绝。

30

当我将UserInstance选项更改为“False”后,错误开始出现。

由于我想使用全文搜索,必须更改该选项。但是,它停止工作了。有没有什么办法让它重新工作?

我正在以拥有完全控制权的Network Service身份运行Application Pool。

12个回答

40
  1. 从这个Microsoft网站下载脚本。
  2. 以管理员身份运行它。
  3. 按照说明操作即可完成设置。

更新 9/3/2014

上述的Microsoft网址已经无效,但有人把它保存到GitHub Gist上,链接如下:https://gist.github.com/wadewegner/1677788

更新 11/1/2021

以下是完整的脚本,我不记得在2014年时可以这样做了,我猜这是2021年的好处之一。

    @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 sqlinstance=SQLEXPRESS) else (set sqlinstance=%1)
    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

1
很遗憾,该链接已经失效,MS存档已被撤下。 - vbocan
5
很幸运有人抽出时间将它存储或提取为Gist https://gist.github.com/wadewegner/1677788。 - Geovani Martinez
谢谢Geovani!你救了我的一命。你能否把gist链接加到你的回答里?我一开始还以为你是一个随机的好心用户。 - Spencer
1
非常好用,谢谢! - Fabiano
成功了..谢谢 - Sushil Kumar
仍然有效。我正在使用Windows 10操作系统。MS SQL Server 2014. - Talha Ashfaque

25

提供了一个解决方案在这里,虽然不是为您的问题而设计的,但对于给定的错误确切有效。

  1. 开始-->所有程序-->Microsoft SQL Server 2005-->配置工具-->SQL Server Surface Area Configuration

  2. 添加新管理员

  3. 选择 'SQLEXPRESS上的SQL Server SysAdmin角色成员' 并将其添加到右侧框中。

  4. 单击"确定"。


4
对于我来说,使用 SQL 2012 在 Windows Server 2012 上,我只需要搜索 SQL 管理工具,然后右键单击并选择“以管理员身份运行”。然后当我创建数据库时,这个错误就消失了。这与下面 @Patel Ravi 的答案相同,但在此答案与 Patel 的答案之间有很多噪音,可能会阻碍你找到它。 - jaminto
Geovani的回答帮助了我解决SQL 2008的问题。似乎2008版本没有SQL Server Surface工具。我在电脑上也没有看到SQL管理工具。 - Spencer
像@jaminto一样,以管理员身份运行SQL Server Management Studio(右键单击,以管理员身份运行)使我能够创建数据库。WOOT - clamum

9

解决微软SQL Server错误:262

点击开始 -> 点击Microsoft SQL Server 2005 现在右键单击SQL Server Management Studio 点击以管理员身份运行


4

4
我遇到了同样的问题,我尝试了以下方法:
  1. 以管理员身份登录您的电脑
  2. 以“Windows身份验证”登录SQL Server管理工具
  3. 点击安全性>登录>选择您要创建数据库的登录名>右键单击,然后选择属性>点击服务器角色>然后勾选'dbcreator'。
  4. 退出并使用您的登录账户重新登录。
这对我有用,希望可以帮助到您。
*抱歉我的英语不好。

你可能只需要dbcreator权限,而不是sysadmin权限。 - 1800 INFORMATION

3
你连接 SQL Server 的登录是什么?你需要使用具有足够权限创建数据库的登录来连接。Network Service 可能不够好,除非你进入 SQL Server 并将其添加为具有足够权限的登录。

1

我知道这是一个老问题,但对我来说没有解决方案。以下是我所做的:

USE master 
GO 
GRANT CREATE TABLE TO PUBLIC

请针对您需要的每个权限重复此操作,例如GRANT CREATE DATABASE TO PUBLIC,...
您必须拥有服务器角色“public”(是的,我是显而易见的船长)。
注意1:GRANT ALL TO PUBLIC已弃用,在2017年不再起作用。
注意2:我尝试使用wix工具集构建msi安装程序。该工具集调用一个powershell文件,创建数据库等。只是为了给您提供一些背景信息 :)

完美,对我也起作用了。只是要补充一点,这似乎是一个特定的 SQL Express 问题和解决方案。在另一个版本中,一个相同的数据库,相同的脚本,没有出现任何问题。 - Vadim Berman

0

这是因为您在表下拉菜单中选择了主表 已选择的表

请选择要使用的表并继续执行查询


0

对@Kho dir答案的补充。

如果您无法使用Windows用户创建数据库,这也适用。您只需要使用SQL Server身份验证登录,然后重复@Kho dir提到的过程即可。


0

对于SQL Server 2012,

  1. 首先,以管理员身份登录到SQL服务器,并转到安全性选项卡

  2. 然后进入服务器角色并双击sysadmin角色

  3. 现在通过单击添加按钮添加要授予权限以创建数据库的用户

  4. 单击确定按钮,现在运行查询

希望这能帮助某些人


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接