【问题标题】:CREATE DATABASE permission denied in database 'master' (EF code-first)数据库“主”中的 CREATE DATABASE 权限被拒绝(EF 代码优先)
【发布时间】:2012-06-27 17:34:41
【问题描述】:

我在我的项目中使用代码优先并在主机上部署,但出现错误

数据库“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"/>

【问题讨论】:

    标签: code-first


    【解决方案1】:

    我遇到了同样的问题。这对我有用:

    1. 转到 SQL Server Management Studio 并以 Administrator 身份运行它。
    2. 选择安全 -> 然后登录
    3. 在“登录”下选择用户名或任何将访问您的数据库的用户,然后双击它。
    4. 给他们一个服务器角色,这将为他们提供创建数据库的凭据。就我而言,public 已经被检查过了,所以我检查了 dbcreatorsysadmin
    5. 在包管理器控制台上再次运行更新数据库。数据库现在应该已成功创建。

    这是一张图片,以便您了解更大的情况,我当然模糊了我的凭据:

    【讨论】:

    • 当我在更改服务器角色后单击“确定”时出现“为 serverRole 'dbcreator' 添加成员失败”错误
    • 我应该在没有内置/用户的 windows server 2016 上的 sql server 2017 上做什么?使用 IIS ,应用程序的网络服务
    • @williamcage,同样的问题。当您当前的用户没有 dbcreator 权限时,您也不能为其他用户分配此类角色。于是我换了当前用户,解决了。
    • 我需要将角色添加到 BUILTIN\Users 而不是我的 windows 用户。
    【解决方案2】:

    确保您有权创建数据库。(如 user2012810 所述。)

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

    public class YourContext : DbContext
        {
            public YourContext() : base("name=DefaultConnection")
            {
    
            }
    
            public DbSet<aaaa> Aaaas { get; set; }
        }
    

    【讨论】:

    • +1 表示“错误的连接字符串” - 我收到此错误是因为连接字符串中的数据库名称拼写错误。
    【解决方案3】:

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

    所以我使用 Code First(使用现有的数据库方法)逐步完成。

    步骤:

    1. 在Sql server management studio中创建数据库(最好不要表)。
    2. 现在回到 Visual Studio,在服务器资源管理器中添加新创建的数据库的连接。
    3. 现在使用数据库的连接字符串并将其添加到 app.config 中,名称类似于“默认连接”。
    4. 现在在 Context 类中,为其创建一个构造函数并从基类扩展它,并将连接字符串的名称作为参数传递。 就像,

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

    5.现在运行您的代码并查看表被添加到提供的数据库中。

    【讨论】:

      【解决方案4】:

      以管理员身份运行 Visual Studio,它对我有用

      【讨论】:

      • 您运行它的帐户还应该在数据库中具有 sysadmin 或 dbcreator 权限。
      【解决方案5】:

      如果您在解决方案中有多个项目并且将错误的一个设置为启动项目,也会出现此错误。

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

      (感谢masoud

      【讨论】:

        【解决方案6】:

        我已经以我的方式解决了这个问题。 以这种方式尝试连接字符串:

        <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" />
        

        记得将默认 db 从 master 设置为 MFC(在您的情况下为 aspnet-test-2012615153521)。

        【讨论】:

        • 顺便说一句,在开发环境中,设置“Integrated Security = true”以避免错误“只有集成安全可以...”,否则您将无法通过Visual Studio访问数据库。
        【解决方案7】:

        正如错误提示,SQL 登录没有创建数据库的权限。当登录名具有所需角色时,将授予权限。有权创建、更改和删除数据库的角色是dbCreator。因此,应将其添加到登录以解决问题。可以在 SQL Management Studio 上通过右键单击用户然后转到“属性”>“服务器角色”来完成。我遇到了同样的错误并通过这样做解决了它。

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

            仔细检查您的连接字符串。当它指向不存在的数据库时,EF 尝试在master 数据库中创建表,可能会出现此错误。
            在我的例子中,数据库名称有错别字。

            【讨论】:

            • 感谢您的指点。有时,小事会被忽略。我用新的用户名替换了 web.config 中的 Db 名称。
            【解决方案10】:

            我遇到了似乎是这个错误。我在 windows 上运行,发现我的管理员 windows 用户没有数据库管理员权限。

            1. 从“服务”关闭 SQL Server

            1. 打开 cmd 窗口(以管理员身份)并使用此命令以本地管理员身份运行单用户模式(MSSQL 版本可能不同):
            "C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\Binn\sqlservr.exe" -m -s SQLEXPRESS
            
            1. 打开另一个 cmd 窗口(以管理员身份)
            2. 在该终端上打开 sqlcmd:
            sqlcmd -S .\SQLEXPRESS
            
            1. 现在将 sysadmin 角色添加到您的用户:
            sp_addsrvrolemember 'domain\user', 'sysadmin'
            GO
            
            1. 从“服务”重新启用 SQL Server

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

            【讨论】:

            • 在我的场景中工作,当时我什至无法在“正常”场景中授予权限(来自 mssms)
            • 它对我有用,我认为这是适用于许多场景的最一致的方式。谢谢。
            【解决方案11】:

            以管理员身份运行 Visual Studio 并将您的 SQL SERVER 身份验证登录名(有权创建数据库)和密码放在连接字符串中,它对我有用

            【讨论】:

              【解决方案12】:
              1. 手动创建空数据库。
              2. 将连接字符串中的“Integrated Security”从“true”更改为 “假”。
              3. 确保您的用户是新数据库中的系统管理员

              现在我希望你可以成功执行 update-database。

              【讨论】:

                【解决方案13】:

                我将添加我必须做的事情,因为它是上述内容的合并。 我使用的是 Code First,尝试使用“create-database”,但标题中出现错误。 关闭并重新打开(这次作为管理员) - 命令无法识别,但使用了“更新数据库”。同样的错误。

                以下是我为解决该问题所采取的步骤:

                1) 打开 SQL Server Management Studio 并创建数据库“视频”

                2) 在 VS2013 中打开服务器资源管理器(在“查看”下)并连接到数据库。

                3) 右击连接->属性,抓取连接字符串。

                4) 在 web.config 我添加了连接字符串

                   <connectionStrings>
                <add name="DefaultConnection"
                  connectionString="Data Source=MyMachine;Initial Catalog=Videos;Integrated Security=True" providerName="System.Data.SqlClient"
                  />
                  </connectionStrings>
                

                5) 在我设置上下文的地方,我需要引用 DefaultConnection:

                using System.Data.Entity;
                
                namespace Videos.Models
                {
                public class VideoDb : DbContext
                {
                    public VideoDb()
                        : base("name=DefaultConnection")
                    {
                
                    }
                
                    public DbSet<Video> Videos { get; set; }
                }
                }
                

                6) 在包管理器控制台中运行“update-database”来创建表。

                请记住,您可以在创建时使用 Seed() 在 Configuration.cs 中插入值:

                        protected override void Seed(Videos.Models.VideoDb context)
                        {
                        context.Videos.AddOrUpdate(v => v.Title,
                            new Video() { Title = "MyTitle1", Length = 150 },
                            new Video() { Title = "MyTitle2", Length = 270 }
                            );
                
                        context.SaveChanges();
                        }
                

                【讨论】:

                  【解决方案14】:

                  检查连接字符串是否在您的 Web.Config 中。我删除了该节点并将其放入我的 Web.Debug.config 中,这是我收到的错误。将其移回 Web.config 并运行良好。

                  【讨论】:

                    【解决方案15】:

                    第 1 步:断开与本地帐户的连接。

                    第 2 步:再次使用您的管理员用户连接到服务器

                    步骤 3:对象资源管理器 -> 安全 -> 登录 -> 右键单击​​您的服务器名称 -> 属性 -> 服务器角色 -> 系统管理员 -> 确定

                    第 4 步:断开连接并连接到本地登录并创建数据库。

                    【讨论】:

                      【解决方案16】:

                      在你的主数据库上运行它

                      ALTER SERVER ROLE sysadmin ADD MEMBER your-user;  
                      GO 
                      

                      【讨论】:

                        【解决方案17】:

                        我的解决方案没有任何证据,只是假设。

                        在我的情况下,它是由连接字符串中的域名引起的。我假设如果 DNS 服务器不可用,它就无法连接到数据库,因此实体框架会尝试创建这个数据库。但是权限被拒绝,这是正确的。

                        【讨论】:

                        • 就我而言,这个答案是正确的,我有一个稍微错误的数据库名称(例如,当它应该是 myDB 时是 my_DB),我从 EF 收到的唯一错误是“CREATE DATABASE 权限被拒绝在'master'中!**多么荒谬,我不得不花费数小时来追踪这个,而EF应该告诉我'my_DB'不存在**
                        【解决方案18】:

                        对我有用的解决方案是使用在创建 edmx 文件时运行数据库第一个向导时创建的实体框架连接字符串。连接字符串需要元数据文件引用,例如“metadata=res:///PSEDM.csdl|res:///PSEDM.ssdl|res://*/PSEDM.msl”。此外,连接字符串需要在调用应用程序的配置中。

                        HT 这篇文章为我指明了方向:Model First with DbContext, Fails to initialize new DataBase

                        【讨论】:

                          【解决方案19】:

                          对我来说,我只需关闭所有当前会话,包括 SQL Server Management Studio,然后我重新打开执行下面的脚本就可以正常工作

                          IF EXISTS (SELECT NAME FROM master.sys.sysdatabases WHERE NAME = 'MyDb')
                          DROP DATABASE mydb RESTORE DATABASE SMCOMDB FROM DISK = 'D:/mydb.bak' 
                          

                          【讨论】:

                            【解决方案20】:

                            我遇到了同样的问题,我尝试了互联网上的所有内容。但是 SSMS 以管理员身份运行为我工作。 如果您仍然遇到一些问题,请确保您必须已下载 SQL SERVER。

                            【讨论】:

                              【解决方案21】:

                              这个错误的原因可能是由于将visual sudio 2013中的版本依赖localdb转发到VS 2015以后的版本无关localDB,所以 只需将您的 web.config 文件 connectionStrings 从 (localDb)\v11.0 更改为 (localDB)\MSSQLLocalDB 就可以了。 这是一个很好的解释Version independent local DB in Visual Studio 2015

                              【讨论】:

                                【解决方案22】:

                                如果您使用 .\SQLExpress 作为数据源,您可以在连接字符串中添加“User Instance=True”属性,修复标题中提到的错误。

                                例如,

                                
                                Data Source=.\\SQLExpress;Integrated Security=true;  
                                User Instance=true;  
                                AttachDBFilename=|DataDirectory|\app_data\Northwind.mdf;  
                                Initial Catalog=Northwind;
                                

                                用户实例允许本地计算机上的非管理员用户附加和连接到 SQL Server Express 数据库。每个实例在单个用户的安全上下文下运行,每个用户一个实例。

                                参考:MSDN Link for SQL Server Express User Instances

                                【讨论】:

                                  【解决方案23】:

                                  解决这个问题很简单安装一个具有新实例名称的新实例。假设您的最后一个实例名称是 'Sqlexpress' ,所以这次在安装期间,将您的实例命名为 'Sqlexpress1' 。另外不要忘记在安装过程中选择混合模式(即 Sql Server 身份验证和 Windows 身份验证),并提供系统管理员密码,如果将来出现此类问题,这将很方便。 这个解决方案肯定会解决这个问题。谢谢。。

                                  【讨论】:

                                    【解决方案24】:

                                    权限被拒绝是一种安全措施,因此您需要添加“用户”权限..

                                    1. 右键单击您的数据库(即 .mdf 文件),然后单击属性
                                    2. 转到安全选项卡
                                    3. 点击继续按钮
                                    4. 点击添加按钮
                                    5. 点击前进按钮
                                    6. 将显示另一个窗口,然后单击右侧的“立即查找”按钮。
                                    7. 在下面的字段中,转到最底部并单击“用户”。点击确定。
                                    8. 点击您已创建的权限“用户”,然后选中完全控制复选框。

                                    给你。您现在拥有数据库的权限。

                                    注意:上述问题中的连接字符串是使用 SQL-server 身份验证。因此,在进行上述步骤之前,您必须先使用 windows-authentication 登录,然后您必须授予使用 sql-server 身份验证的用户权限。类似“dbcreator”的权限。

                                    如果您使用 SQL Server 身份验证登录并尝试向您登录的用户授予权限。它显示,权限被拒绝错误。

                                    【讨论】:

                                    • 在创建数据库的权限被拒绝的情况下,如何右键数据库?
                                    • 在数据库尚未创建时无法右键单击它!
                                    • 在 sql server 2008 R2 中,第 3 步应该是点击编辑而不是继续。
                                    • 如果 34 个尚未创建数据库的用户被指示编辑现有数据库的设置,为什么这是一个答案?
                                    • CREATE DATABASE permission deniedright click you database。等等,什么?
                                    猜你喜欢
                                    • 1970-01-01
                                    • 2015-12-30
                                    • 1970-01-01
                                    • 2020-06-19
                                    • 1970-01-01
                                    • 2016-12-17
                                    • 2023-03-05
                                    • 1970-01-01
                                    • 2014-10-20
                                    相关资源
                                    最近更新 更多