【问题标题】:Oracle + dbunit throws AmbiguousTableNameExceptionOracle + dbunit 抛出 AmbiguousTableNameException
【发布时间】:2013-02-13 11:38:26
【问题描述】:

我正在使用 DBUnit 填充数据库,以便其内容在测试期间是已知内容。

我正在处理的数据库架构位于一个 Oracle 11g 实例中,它们驻留在其他数据库架构中。在其中一些模式中定义了一个表,该表已与公共同义词相关联,并且已被授予选择权限。

当我运行定义必须如何填充数据库的 xml 时,如果 xml 文件包含在多个模式中定义的表,DBUnit 会在该表上引发 AmbiguousTableNameException 异常。

我发现有 3 种解决方案可以解决此问题:

  1. 使用只能访问一个数据库连接凭据 数据库架构。
  2. 为 DatabaseConnection 或 DatabaseDataSourceConnection 构造函数。
  3. 启用限定表名支持(请参阅操作说明文档)。

在我的情况下,我只能应用解决方案 1,但即使我采用它,我也会遇到同样的异常。

给我带来问题的表在 3 个模式中定义,我没有机会以任何方式对其采取行动。

拜托,有人可以帮助我吗?

【问题讨论】:

  • AmbiguousTableNameException 如果在 DataSet 中多次指定同一个表,例如new DefaultDataSet(new ITable[] { new DefaultTable("myschema.mytable"), new DefaultTable("myschema.mytable") });

标签: database oracle dbunit


【解决方案1】:

我找到了解决方案:我在表的名称中指定了架构,并将属性http://www.dbunit.org/features/qualifiedTableNames 设置为true(对应于org.dbunit.database.FEATURE_QUALIFIED_TABLE_NAMES)。

通过这种方式,我填充表格的 xml 代码如下所示:

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  <SCHEMA.TABLE ID_FIELD="1" />
</dataset>

其中SCHEMA 是架构名称,TABLE 是表名称。

为了设置属性,我使用了以下代码:

DatabaseConfig dBConfig = dBConn.getConfig(); // dBConn is a IDatabaseConnection
dBConfig.setProperty(DatabaseConfig.FEATURE_QUALIFIED_TABLE_NAMES, true);

【讨论】:

  • 对于 Spring JDBC,使用最新的 MySQL 连接器 (v8.0.17) 我还必须在 Spring 的 javax.sql.DataSource 的实现上另外设置以下属性"props.setProperty("databaseTerm", "schema");"
【解决方案2】:

就我而言,

我将 dba 角色授予用户,因此 dbunit 抛出 AmbiguousTableNameException。

在我撤销用户的 dba 角色后,我解决了这个问题。

SQL> revoke dba from username;

【讨论】:

  • 谢谢。这解决了我的问题。
【解决方案3】:

我在执行 Dbunits aginst Oracle DB 时遇到了同样的 AmbiguousTableNameException。它工作正常,有一天开始抛出错误。

根本原因:调用存储过程时,误将其修改为小写。当更改为大写时,它开始工作。

我也可以通过将 shema 名称设置为 IDatabaseTester 来解决这个问题,例如 iDatabaseTester.setSchema("SCHEMANAMEINCAPS")

谢谢 史密莎

【讨论】:

    【解决方案4】:

    我使用 SpringJDBC 和 MySQL 连接器 (v8.0.17)。仅遵循this answer 中解释的两个步骤并没有帮助。

    1. 首先我必须在 spring 数据源上设置 schema
    2. 然后我还必须将属性 "databaseTerm" 设置为 "schema"
      • 默认设置为“目录”为explained here
      • 我们必须设置这个属性,因为(在 Spring 的 javax.sql.DataSource 实现中)如果没有设置(即默认为 "catalogue"),那么连接由 @ 返回987654325@ 不会在其上设置 schema,即使我们已在 dataSource 上设置它。
       @Bean
       public DriverManagerDataSource cloudmcDataSource() {
          DriverManagerDataSource dataSource = new DriverManagerDataSource();
          dataSource.setDriverClassName("<driver>");
          dataSource.setUrl("<url>");
          dataSource.setUsername("<uname>");
          dataSource.setPassword("<password>");
          dataSource.setSchema("<schema_name>");
    
          Properties props = new Properties();
          // the following key-value pair are constants; must be set as is
          props.setProperty("databaseTerm", "schema");  
          dataSource.setConnectionProperties(props);
          return dataSource;
       }
    
    1. 不要忘记进行answer here 中说明的更改。

    【讨论】:

      猜你喜欢
      • 2012-04-23
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多