gpt4 book ai didi

oracle - ORA-01031 : insufficient privileges with Oracle view using Entity Framework

转载 作者:行者123 更新时间:2023-12-03 07:01:08 25 4
gpt4 key购买 nike

环境

  1. Oracle 11g
  2. EntityFramework 6.1.1
  3. Oracle.ManagedDataAccess v 12.1.022
  4. Oracle.ManagedDataAccess.EntityFramework v 12.1.022

使用 Entity Framework 在 MVC 应用程序 Controller 中执行 LINQ 语句时,出现 ORA-01031 错误。

正在使用非 Oracle 架构所有者的用户对 Oracle View 执行 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;
  1. 当我使用用户 DART 使用 Toad 软件登录时,我可以针对表和 View 执行 select 语句。

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

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

  4. 使用 View 很重要,因为我们的 GIS 系统中的每个 B$ 表都有事务记录,例如 ADDDELETE编辑

    这是由供应商内置的事务表示。每个 View 都会消除这些事务记录。

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

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

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

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

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

我创建了简单的 Controller 操作并将用户返回到 MVC View

此代码有效:

public ActionResult Test()
{

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

ViewBag.User = test;

return View();

}

在查询 Oracle View 而不是 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 交谈并询问他的意见。

谢谢。

最佳答案

这个问题已经解决了。因为我正在使用现有的 Oracle 数据库,所以我必须禁用数据库初始值设定项。

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

Database.SetInitializer<VisualInspectionDbContext>(null);

}

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

问候,

谢尔盖

关于oracle - ORA-01031 : insufficient privileges with Oracle view using Entity Framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31925605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com