Для разработки нашей базы данных мы имеем, с одной стороны, полный сценарий DDL-схемы, для «чистых» установок, а с другой - набор последовательных «дельта-» сценариев для обновлений (каждый сценарий записывается как выполненный или нет в специальной базе данных). таблицу).
Чтобы проверить это, у нас есть цель ant, которая устанавливает более старую версию, обновляет ее и сравнивает схему с вновь созданной. Мы используем метаданные JDBC для сравнения схем, и с Oracle 10 это сработало просто замечательно.
Теперь мы обновились до Oracle 11 и перешли с ojdbc14.jar на ojdbc6.jar. В Oracle 10 тест по-прежнему выполняется зеленым, но в Oracle 11 мы получаем (два типичных примера):
Table <table X> has column <column A> as NUMBER(1,0) NOT NULL in <new schema>, but as NUMBER(0,0) NOT NULL in <upgraded schema>
Table <table Y> has column <column B> as NUMBER(0,-127) NOT NULL in <new schema>, but as NUMBER(0,0) NOT NULL in <upgraded schema>
Выглядит почти (-127 - это уже не очень хороший масштаб) Хорошо, если мы сделали что-то не так. Но те же самые файлы работали раньше, и вот операторы сценария:
DDL скрипт:
CREATE TABLE <table X> (
...
<column B> NUMBER(1) DEFAULT 0 NOT NULL,
...
)
CREATE TABLE <table Y> (
...
<column B> NUMBER DEFAULT 1 NOT NULL,
...
)
Дельта-скрипт:
ALTER TABLE <table X> ADD (
<column A> NUMBER(1) DEFAULT 0 NOT NULL
)
ALTER TABLE <table Y> ADD (<column B> NUMBER DEFAULT 1 NOT NULL)
А вот код метаданных JDBC:
public class Column {
String name;
int scale;
int precision;
boolean nullable;
String type;
public Column(ResultSetMetaData metaData, int column) throws SQLException {
name = metaData.getColumnName(column);
type = metaData.getColumnTypeName(column);
scale = metaData.getScale(column);
precision = metaData.getPrecision(column);
nullable = metaData.isNullable(column) == ResultSetMetaData.columnNullable;
}
@Override
public String toString() {
return type + "(" + precision + "," + scale + ") "
+ (nullable ? "NULL" : "NOT NULL");
}
}
Да, индекс столбца начинается с 1, и это значение toString () используется для сравнения различных столбцов (также используется в выводе ошибки выше).
Я отлаживал этот код, и, насколько я вижу, драйвер JDBC Oracle получает эти значения при внутреннем «описании» таблицы для создания метаданных.
Обратите внимание, что обе схемы находятся в одном и том же экземпляре базы данных, и оба соединения JDBC выполняются одной и той же библиотекой JDBC. Те же несоответствия возникают при использовании старого ojdbc14.jar, но никогда в Oracle 10.
Кто-нибудь знает, как это может быть? Я застрял, и мы остались без надежной проверки наших сценариев обновления базы данных.