首页 文章

ORA-01031:使用Entity Framework的Oracle视图权限不足

提问于
浏览
2

环境

  • Oracle 11g

  • EntityFramework 6.1.1

  • Oracle.ManagedDataAccess v 12.1.022

  • Oracle.ManagedDataAccess.EntityFramework v 12.1.022

在使用Entity Framework在MVC应用程序控制器中执行LINQ语句时,我收到 ORA-01031 错误 .

正在针对Oracle视图执行LINQ语句,其用户不是Oracle模式所有者 . 所有拨款都是通过Oracle角色设置的 .

这是Oracle的定义

--ROLE 

DROP ROLE DART_PORTAL; 

CREATE ROLE DART_PORTAL NOT IDENTIFIED; 

-- Object privileges granted to DART_PORTAL 
GRANT SELECT ON GISPROD.B$FIM_D_POLE_VISINSP_N TO DART_PORTAL; --table 
GRANT SELECT ON GISPROD.FIM_D_POLE_VISINSP_N TO DART_PORTAL; --view 
GRANT EXECUTE ON GISPROD.LTT_USER TO DART_PORTAL; --package is being utilized in VIEW  

-- Grantees of DART_PORTAL
GRANT DART_PORTAL TO DART WITH ADMIN OPTION;        --user 
GRANT DART_PORTAL TO GISPROD WITH ADMIN OPTION;     --schema owner 

--USER 

DROP USER DART CASCADE; 

CREATE USER DART 
  IDENTIFIED BY <password> 
  DEFAULT TABLESPACE GISDEV 
  TEMPORARY TABLESPACE TEMP 
  PROFILE DEFAULT 
  ACCOUNT UNLOCK; 
  -- 3 Roles for DART 
  GRANT DART_INTERFACE TO DART WITH ADMIN OPTION; --another role 
  GRANT DART_PORTAL TO DART WITH ADMIN OPTION; --role from the role script 
  GRANT RESOURCE TO DART; 
  ALTER USER DART DEFAULT ROLE ALL; 
  -- 5 System Privileges for DART 
  GRANT ALTER SESSION TO DART; 
  GRANT CREATE SESSION TO DART; 
  GRANT EXECUTE ANY PROCEDURE TO DART; 
  GRANT SELECT ANY SEQUENCE TO DART; 
  GRANT UNLIMITED TABLESPACE TO DART;
  • 当我使用用户DART使用Toad软件登录时,我可以对表和视图执行select语句 .

  • 当我在Visual Studio中的Server Explorer上使用相同的用户时 - 表和视图节点为空 .

  • 我可以使用LINQ查询Oracle表,但不能查询Oracle View .

  • 使用视图很重要,因为我们GIS系统中的每个 B$ 表都有事务记录,如 ADDDELETEEDIT .

这是交易表示由供应商内置 . 每个视图都消除了这些事务记录 .

你能告诉我我缺少哪些Oracle权限吗?

而且,我可以将Oracle视图与Entity Framework一起使用吗?

如果没有,我想我必须构建自定义LINQ扩展方法,以便在直接从Oracle表中选择记录时消除这些事务记录 .

web.config 中定义的连接字符串:

<add name="GisStageDbContext" connectionString="DATA SOURCE=SERVERNAME:PORT/SERVICENAME;USER ID=DART;PASSWORD=PASSWORD" providerName="Oracle.ManagedDataAccess.Client" />

我创建了简单的控制器操作并将用户返回到MVC视图

此代码有效:

public ActionResult Test()
{

var test = _testContext.Database.SqlQuery<string>("select user from dual").First();

ViewBag.User = test;

return View();

}

查询Oracle视图但不查询Oracle表时,我仍然遇到同样的错误

此代码与表名一起按预期工作

[Table(name:"B$FIM_D_POLE_VISINSP_N")]
public partial class FimPole
{

    [Key]
    [Column(name: "G3E_ID", Order = 0)]
    [Display(Name = "G3E ID")]
    public long Id { get; set; }

    [Column(name: "FIM_STATE")]
    [Display(Name = "Fim State")]
    [StringLength(maximumLength: 15)]
    public string FimState { get; set; }

    [Column(name: "INSPECTION_STATUS")]
    [Display(Name = "inspection Status")]
    [StringLength(maximumLength: 15)]
    public string InspectionStatus { get; set; }

}

此代码不起作用,并给我错误

[Table(name:"FIM_D_POLE_VISINSP_N")]
public partial class FimPole
{
//Same fields
}

数据库上下文类是

public class VisualInspectionDbContext : DbContext
{

  public VisualInspectionDbContext()
    : base("name=GisStageDbContext"){}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.HasDefaultSchema("GISPROD");

  }
  public DbSet<AssetPole> AssetPoles { get; set; }
  public DbSet<FimPole> FimPoles { get; set; }
}

我必须和我们的Oracle DBA交谈并询问他的意见 .

谢谢 .

1 回答

  • 3

    这已经解决了 . 因为我正在使用现有的Oracle数据库,所以我不得不禁用数据库初始化程序 .

    public VisualInspectionDbContext()
        : base("name=GisStageDbContext")
    {
    
        Database.SetInitializer<VisualInspectionDbContext>(null);
    
    }
    

    基本上DART用户是低权限用户,并且没有任何创建数据库表的权限 . 每次DBContext对象初始化时 - 实体框架都试图在没有权限的用户下创建Oracle表 . 无论如何,如果您使用现有数据库 - 禁用初始化程序,否则;将根据C#类定义重新创建每个表 . 我希望这篇文章能够帮助其他人 .

    问候,

    Serghei

相关问题