在数据库'master'中拒绝CREATE DATABASE权限(EF code-first)

87

我在项目中使用Code First并部署在主机上,但是遇到错误。

在数据库'master'中,CREATE DATABASE权限被拒绝。

这是我的连接字符串:

<add name="DefaultConnection" 
     connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=aspnet-test-2012615153521;Integrated Security=False" 
     providerName="System.Data.SqlClient;User ID=test;Password=test"/>
30个回答

91

我遇到了同样的问题。这是我解决问题的方法:

  1. 打开SQL Server管理工具并以管理员身份运行。
  2. 选择Security -> Logins
  3. 在登录中选择要访问数据库的用户名或其他用户,并双击它。
  4. 给它们一个服务器角色,使它们拥有创建数据库的凭据。在我的情况下,public已经被选中,所以我选中了dbcreatorsysadmin
  5. 在Package Manager Console上再次运行update-database。数据库现在应该成功创建。

这里有一张图片,以便您能够更好地了解情况,我当然模糊了我的凭据:enter image description here


8
在更改服务器角色后,当我点击确定时,出现“添加成员到 serverRole 'dbcreator' 失败”的错误信息。 - william cage
在 Windows Server 2016 上的 SQL Server 2017 中没有内置用户,我该怎么办?我正在使用 IIS,应用程序需要使用 Network Service。 - Tzvi Gregory Kaidanov
2
@williamcage,同样的问题。当您的当前用户没有 dbcreator 权限时,您也无法为其他用户分配此角色。因此,我更改了当前用户并解决了问题。 - Zhang
1
我需要将角色添加到BUILTIN\Users而不是我的Windows用户。 - Ronen Festinger

21

请确保您有创建数据库的权限。(如user2012810所提到的。)

或者

看起来您的代码首先使用了另一个(或默认)连接字符串。 您是否在上下文类中设置了连接名称?

public class YourContext : DbContext
    {
        public YourContext() : base("name=DefaultConnection")
        {

        }

        public DbSet<aaaa> Aaaas { get; set; }
    }

+1 是指“错误的连接字符串” - 我之所以会出现这个错误,是因为连接字符串中的数据库名称拼写错误。 - user0474975

20

在使用 Code First(不使用数据库方法)创建数据库时,我遇到了同样的问题。问题在于 EF 没有足够的权限为你创建数据库。

所以我采用了 Code First(使用现有数据库方法)的方式来解决。

步骤:

  1. 在 Sql Server 管理工具中创建一个数据库(最好不包含表)。
  2. 回到 Visual Studio,将新创建的数据库连接添加到服务器资源管理器中。
  3. 现在使用数据库的连接字符串,并在 app.config 中添加一个名称为“Default Connection”的连接字符串。
  4. 现在,在上下文类中为其创建一个构造函数,并从基类中扩展它并将连接字符串的名称作为参数传递。

    public class DummyContext : DbContext
    {
      public DummyContext() : base("name=DefaultConnection")
      {
      }  
    }
    

5.现在运行你的代码,看看表格是否成功添加到数据库中。


12

以管理员身份运行Visual Studio,这对我有效。


你运行它的账户也应该在数据库中拥有sysadmin或dbcreator权限。 - vapcguy

9

如果您在解决方案中有多个项目,并且设置的启动项不正确,也会导致此错误。

这很重要,因为Update-Database使用的连接字符串来自启动项目,而不是在程序包管理器控制台中选择的"默认项目"。

(感谢masoud)


8

我用自己的方法解决了这个问题。 尝试按照以下方式连接字符串:

<add name="MFCConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MFC.mdf;Initial Catalog=MFC;Integrated Security=false;User ID=sa;Password=123"
  providerName="System.Data.SqlClient" />

请记得将默认的数据库从master更改为MFC(在您的情况下,是aspnet-test-2012615153521)。


顺便提一下,在开发环境中,设置“Integrated Security = true”以避免出现错误“只有集成安全性才能……”,否则您将无法通过Visual Studio访问数据库。 - cheny
谢谢。对我有用,但是需要做一些更改。我从connectionString中删除了"\SQLEXPRESS"和整个";AttachDbFilename=|DataDirectory|\MFC.mdf"。 - Hamid Nasirloo

7
我遇到了一个看起来像这样的错误。我在 Windows 上运行时发现我的管理员 Windows 用户没有访问数据库的管理员权限。
  1. 从“服务”中关闭 SQL Server

Disable Services

  1. 打开cmd窗口(以管理员身份),并使用此命令以本地管理员身份运行单用户模式(MSSQL的版本可能不同):
"C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\Binn\sqlservr.exe" -m -s SQLEXPRESS
  1. 打开另一个管理员权限的命令提示符窗口
  2. 在该终端上使用以下命令打开sqlcmd:
sqlcmd -S .\SQLEXPRESS

现在将sysadmin角色添加到您的用户中:
sp_addsrvrolemember 'domain\user', 'sysadmin'
GO
  1. 从“服务”中重新启用SQL Server

致谢: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/76fc84f9-437c-4e71-ba3d-3c9ae794a7c4/


1
在我的情况下起作用了,当我甚至无法在“正常”情况下(从mssms)授予权限时。 - Piotr M
它对我起作用了,我认为这是最一致的方法,适用于许多情况。谢谢。 - Moshi
哦,"无法更改服务器角色 'sysadmin',因为它不存在或您没有权限。" - fragg
如果使用默认的MSSQL实例(例如“ MSSQLSERVER”),在连接到MSSQL实例时,仅使用“。”作为“sqlcmd”命令的参数。 - eduardomozart

6

请仔细检查您的连接字符串。如果连接字符串指向不存在的数据库,EF 就会尝试在 master 数据库中创建表,这就可能引发此错误。
在我的情况下,是数据库名称中有一个拼写错误。


谢谢指针。有时候,小事情容易被忽视。我已经在web.config中用新的用户名替换了数据库名称。 - Mandeep Janjua

4
  1. 手动创建空数据库。
  2. 将连接字符串中的"Integrated Security"从"true"更改为"false"。
  3. 确保您的用户是新数据库中的sysadmin。

现在我希望您能成功执行update-database命令。


3

如果您正在IIS下运行网站,则可能需要将应用程序池的身份设置为管理员。


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