ORA-01031:使用实体框架的 Oracle 视图权限不足

Ser*_*i T 3 oracle entity-framework

环境

  1. 甲骨文 11g
  2. 实体框架 6.1.1
  3. Oracle.ManagedDataAccess v 12.1.022
  4. Oracle.ManagedDataAccess.EntityFramework v 12.1.022

ORA-01031使用实体框架在 MVC 应用程序控制器中执行 LINQ 语句时出现错误。

正在使用不是 Oracle 架构所有者的用户对 Oracle 视图执行 LINQ 语句。所有授权都是通过 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;
Run Code Online (Sandbox Code Playgroud)
  1. 当我使用用户 DART 使用 Toad 软件登录时,我可以对表和视图执行选择语句。

  2. 当我在 Visual Studio 的服务器资源管理器上使用相同的用户时 - 表和视图节点为空。

  3. 我可以使用 LINQ 查询 Oracle 表,但不能使用 Oracle 视图。

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

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

你能告诉我我缺少哪些 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" />
Run Code Online (Sandbox Code Playgroud)

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

此代码有效:

public ActionResult Test()
{

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

ViewBag.User = test;

return View();

}
Run Code Online (Sandbox Code Playgroud)

查询 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; }

}
Run Code Online (Sandbox Code Playgroud)

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

[Table(name:"FIM_D_POLE_VISINSP_N")]
public partial class FimPole
{
//Same fields
}
Run Code Online (Sandbox Code Playgroud)

数据库上下文类是

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; }
}
Run Code Online (Sandbox Code Playgroud)

我必须与我们的 Oracle DBA 交谈并询问他的意见。

谢谢你。

Ser*_*i T 5

这已得到解决。因为我正在使用现有的 Oracle 数据库,所以我不得不禁用数据库初始值设定项。

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

    Database.SetInitializer<VisualInspectionDbContext>(null);

}
Run Code Online (Sandbox Code Playgroud)

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

问候,

谢尔盖