ORA-01031:使用实体框架的Oracle视图权限不足
环境 甲骨文11g 实体框架6.1.1 Oracle.ManagedDataAccess v 12.1.022 Oracle.ManagedDataAccess.EntityFramework v 12.1.022 我在使用实体框架的MVC应用程序控制器中执行LINQ语句时遇到ORA-01031错误 正在对Oracle视图执行LINQ语句,用户不是Oracle架构所有者。所有授权都是通过Oracle角色设置的 这是Oracle的定义ORA-01031:使用实体框架的Oracle视图权限不足,oracle,entity-framework,Oracle,Entity Framework,环境 甲骨文11g 实体框架6.1.1 Oracle.ManagedDataAccess v 12.1.022 Oracle.ManagedDataAccess.EntityFramework v 12.1.022 我在使用实体框架的MVC应用程序控制器中执行LINQ语句时遇到ORA-01031错误 正在对Oracle视图执行LINQ语句,用户不是Oracle架构所有者。所有授权都是通过Oracle角色设置的 这是Oracle的定义 --ROLE DROP ROLE DART_PORTAL;
--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;
我创建了简单的控制器操作并将用户返回到MVC视图
此代码适用于:
public ActionResult Test()
{
var test = _testContext.Database.SqlQuery<string>("select user from dual").First();
ViewBag.User = test;
return View();
}
此代码不工作,请告诉我错误
[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类定义重新创建。
我希望这篇文章能帮助其他人
问候,
SergheiLINQ和EF与您的错误无关。显然,EF没有使用DART用户连接到数据库。你检查过你的连接字符串了吗?我刚才提到LINQ是因为我在MVC项目中使用它。连接字符串100%正确。如果我将视图更改为table name,则查询可以工作。[TableName]MyClass{}工作正常。[TableViewName]MyClass{}不起作用。在web.configLet中定义的相同连接字符串让我们对其进行测试。你能运行这个,告诉我们什么字符串回来了吗?context.Database.SqlQueryselect user from dual.First;如果我在连接字符串中使用模式所有者并以这种方式装饰C类-[TableViewName]MyClass{},我会遇到另一个错误:对象名已经在使用中。我有工作中的所有细节,明天可以提供。我真的很感谢你的帮助。明天我将运行测试。如果明天您有更多详细信息,请确保通过编辑将其添加到您的帖子中。这样做总比不断添加评论要好。更多的人将以这种方式看到新信息。
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; }
}
public VisualInspectionDbContext()
: base("name=GisStageDbContext")
{
Database.SetInitializer<VisualInspectionDbContext>(null);
}