0

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

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

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

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

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

就我而言,我只能应用解决方案 1,但即使我采用它,我也会遇到同样的异常。

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

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

4

4 回答 4

4

我找到了解决方案:我在表的名称中指定了架构,并设置true了属性http://www.dbunit.org/features/qualifiedTableNames(对应于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);
于 2013-02-18T08:38:41.940 回答
1

就我而言,

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

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

SQL> revoke dba from username;
于 2015-09-08T01:27:22.420 回答
0

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

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

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

谢谢史密莎

于 2015-04-27T10:00:47.720 回答
0

我正在使用 SpringJDBC 和 MySQL 连接器(v8.0.17)。仅遵循此答案中解释的 2 个步骤并没有帮助。

  1. 首先,我必须在 spring 数据源上设置模式。
  2. 然后我还必须将属性“databaseTerm”设置为“schema”
    • 默认情况下,它设置为“目录”,如此处所述
    • 我们必须设置这个属性,因为(在 Spring 的实现中javax.sql.DataSource如果没有设置(即默认为“catalogue”),那么即使我们在dataSourcedataSource.getConnection()上设置了它,返回的连接也不会设置模式
   @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. 不要忘记在此处进行回答中解释的更改。
于 2020-10-28T15:54:29.147 回答