列出表导致“数据库中的 CREATE TABLE 权限被拒绝”ASP.NET - MVC4

Posted

技术标签:

【中文标题】列出表导致“数据库中的 CREATE TABLE 权限被拒绝”ASP.NET - MVC4【英文标题】:Listing table results in "CREATE TABLE permission denied in database" ASP.NET - MVC4 【发布时间】:2013-01-21 13:15:33 【问题描述】:

我正在使用 ASP.NET MVC 4 - c# 连接到实时数据库并列出结果,但是当我查看该页面时,它返回以下错误:

CREATE TABLE permission denied in database 'DatabaseName'.

Description: An unhandled exception occurred during the execution
of the current web request. Please review the stack trace for more
information about the error and where it
originated in the code.



Exception Details: System.Data.SqlClient.SqlException: CREATE TABLE
permission denied in database 'DatabaseName'.

Source Error: 


Line 16:         public ActionResult Index()
Line 17:         
Line 18:             return View(db.AccControls.ToList());
Line 19:         
Line 20

控制器:

namespace TestDBCon.Controllers

    public class HomeController : Controller
    
        private DataDbContext db = new DataDbContext();

        public ActionResult Index()
        
            return View(db.AccControls.ToList());
        

    

AccControl.cs(模型)

namespace TestDBCon.Models

    public class AccControl
    
        public int ID  get; set; 
        public int ControlCode  get; set; 
        public string Nominal  get; set; 
        public string CostCentre  get; set; 
        public string Department  get; set; 
    

    public class DataDbContext : DbContext
    
        public DbSet<AccControl> AccControls  get; set; 
    

Web.Config:

<add name="DataDbContext" connectionString="Data Source=***;initial catalog=***;integrated security=True;" providerName="System.Data.SqlClient" />

我不是要创建表?我只是想列出结果,所以我非常困惑。一定和MVC有关吧?

任何帮助将不胜感激!

谢谢

【问题讨论】:

您的网络配置是否指向正确的数据库?,您能告诉我们db的声明和初始化吗? 你能确定你使用的用户有创建数据库的权限吗? @MMK 我不能亲自更改权限 在 Management Studio 中查看服务器,以与您的应用程序连接的用户相同的用户身份登录,尝试创建一个新数据库。你得到同样的错误吗? @Arran 我无法创建新的数据库/表。但我不需要,我只需要从他们那里读出来 【参考方案1】:

我知道它已经过时了,但由于我遇到了同样的问题,而且我花了一段时间才找到解决方案……我决定分享这些信息。所以我必须做两件事来解决这个问题,第一件事是禁用迁移:

# Migrations/Configuration.cs
internal sealed class Configuration : DbMigrationsConfiguration<IntranetApplication.Models.MyDb1>

    public Configuration()
    
        AutomaticMigrationsEnabled = false;
    

但这还不够,我还必须确保播种机不运行。你可以用这段额外的代码取消它:

#Global.asax.cs
protected void Application_Start()

    AreaRegistration.RegisterAllAreas();
    Database.SetInitializer<Models.MyDb1>(null);
    Database.SetInitializer<Models.MyDb2>(null);

    ...

最后我现在可以使用 LINQ 执行 SELECT 并且只有 READ 访问权限 编辑 根据 Lawrence 的建议,最好将它直接放在 DB Context Constructor 中。感谢您的提示,我更新了我的代码,现在看起来像这样:

public partial class MyDb1 : DbContext

    public MyDb1()
        : base("name=MyDb1Connection")
    
        Database.SetInitializer<Models.MyDb1>(null);
    

    ...

【讨论】:

这对于只读实体框架至关重要,应该标记为答案。没有这个,如果没有 EF 尝试迁移,您将无法更改超时。然而,它不需要在 Application_Start 中完成。 if 可以在modelContext的构造函数中完成。 谢谢,这救了我的培根。这应该被标记为正确答案。【参考方案2】:

您的web config 是否指向正确的数据库?

凭据是否正确?

如果您打算使用MVC4 WebSecutiy() 来处理用户的身份验证和授权,实体框架将在数据库中创建表。这可能会引发异常。

在这种情况下,您无法创建成员资格提供者所需的表,您需要将其从系统中排除。请参阅此here。或者创建一个新的 MVC4 项目并选择空模板,然后放入您需要的部分。

【讨论】:

凭据都正确,我只是不明白为什么 MVC 4 决定尝试创建一个已经存在的表? (对不起,我是新手) 您的 DbContext 是否使用 DataDbContext 连接字符串? MVC4 也会有一个默认的连接字符串。将此更改为与您的 DataDbContext 连接字符串相同。就像我说的,如果你使用内置的 WebSecurity() 来处理用户,MVC4 将尝试创建一些用户表。 我已将默认连接更改为与 DataDbContext 相同,这似乎没有任何改变。我猜内置 WebSecurity() 已启用,有没有办法阻止 MVC4 这样做(创建用户表)? 空模板?简单会员?从 Account 控制器中删除 Initialise 属性? 我设法使用 ADO.NET 实体数据模型使其工作。无论如何,感谢您的所有帮助!真的很感激。【参考方案3】:

我在重构和重命名一些代码后遇到了类似的错误。问题是我的 C# 代码与数据库中的表名不匹配。

我在 c# 中的代码:

public virtual DbSet<MyTableName>

以及SQL Server中的表名:

MyActualTableName

由于表名不匹配(MyTableName != MyActualTableName),我收到了这个(误导性)错误:

Create TABLE permission denied in database MyDatabase

我花了一些时间看看我搞砸了什么,但匹配表名解决了错误。

【讨论】:

以上是关于列出表导致“数据库中的 CREATE TABLE 权限被拒绝”ASP.NET - MVC4的主要内容,如果未能解决你的问题,请参考以下文章

当我使用 operator[] 时列出导致错误的项目

遍历通用节点类,列出所有节点导致无限循环

在时间范围内达到 Redshift 表的查询数

在 Python 中合并交叉表

ActiveRecord:从控制台列出表中的列

列出表和表扩展属性