测试是否存在Teradata表并创建表(如果不存在)

时间:2015-01-07 19:25:39

标签: ruby hudson jruby teradata rubymine

我们的Continuous Inegration服务器(Hudosn)在尝试在Teradata中运行简单的create table语句时遇到了一个奇怪的问题。

此语句测试max_call表的存在:

 unless $teradata_connection.table_exists? :arm_custom_db__max_call_attempt_parameters
  $teradata_connection.run('CREATE TABLE all_wkscratchpad_db.max_call_attempt_parameters AS (SELECT * FROM arm_custom_db.max_call_attempt_parameters ) WITH NO DATA')
end

table_exists?方法执行以下操作:

def table_exists?(name)
        v ||= false # only retry once
        sch, table_name = schema_and_table(name)
        name = SQL::QualifiedIdentifier.new(sch, table_name) if sch
        from(name).first
        true
      rescue DatabaseError => e
        if e.to_s =~ /Operation not allowed for reason code "7" on table/ && v == false
          # table probably needs reorg
          reorg(name)
          v = true
          retry 
        end
        false
      end 

因此,根据from(name).first行,此方法执行的测试只是一个简单的select语句,在SQL中看起来像:SELECT TOP 1 MAX(CAST(MAX_CALL_ATTEMPT_CNT AS BIGINT)) FROM ALL_WKSCRATCHPAD_DB.MAX_CALL_ATTEMPT_PARAMETERS

上述SQL语句在Teradata SQL Assistant中执行得非常好,因此它不是SQL语法问题。我们的测试套件(Rubymine)使用的通用ID也不是问题;该ID具有对arm_custom_db的选择权限。

我可以看到的异常被抛出(在Hudson的构建控制台输出中) Sequel::DatabaseError: Java::ComTeradataJdbcJdbc_4Util::JDBCException。由于此execption是DatabaseError的子类,因此异常也不应该是问题。

另外:我们每天都会对数百个不同的表使用unless这样的语句,除此之外的所有表都正常工作。这句话似乎只是一个问题。

Hudson的构建控制台输出中显示的完整错误消息如下:

[2015-01-07T13:56:37.947000 #16702] ERROR -- : Java::ComTeradataJdbcJdbc_4Util::JDBCException: [Teradata Database] [TeraJDBC 13.10.00.17] [Error 3807] [SQLState 42S02] Object 'ALL_WKSCRATCHPAD_DB.MAX_CALL_ATTEMPT_PARAMETERS' does not exist.: SELECT TOP 1 MAX(CAST(MAX_CALL_ATTEMPT_CNT AS BIGINT)) FROM ALL_WKSCRATCHPAD_DB.MAX_CALL_ATTEMPT_PARAMETERS
Sequel::DatabaseError: Java::ComTeradataJdbcJdbc_4Util::JDBCException: [Teradata Database] [TeraJDBC 13.10.00.17] [Error 3807] [SQLState 42S02] Object 'ALL_WKSCRATCHPAD_DB.MAX_CALL_ATTEMPT_PARAMETERS' does not exist.

我不明白为什么这个特定的代码会给我带来问题...这个表或数据库似乎没什么特别之处,当我签名时,所有SQL代码在Teradata中执行都很好使用与用于执行Hudson代码相同的用户ID。

0 个答案:

没有答案