我们的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。