Есть ли хороший способ проверить правильность схемы базы данных после обновления или миграции? - PullRequest
3 голосов
/ 26 августа 2010

У нас есть клиенты, которые переходят с одной версии базы данных на другую (Oracle 9i до Oracle 10g или 11g, если быть точным).В одном случае клиент экспортировал старую базу данных и импортировал ее в новую, но по какой-то причине индексы и ограничения не были созданы.Возможно, они сделали это специально, чтобы ускорить процесс импорта, но мы все еще выясняем причину.

Реальный вопрос в том, существует ли простой способ проверить, завершена ли структура базы данных после импорта?Есть ли какая-то контрольная сумма, которую мы можем сделать на структуре?Мы понимаем, что могли бы выполнить несколько запросов, чтобы увидеть, существуют ли все таблицы, индексы, псевдонимы, представления, последовательности и т. Д., Но это, вероятно, будет трудно писать и поддерживать.

Спасибо за ответы, предлагающие использовать коммерческие инструменты и / или инструменты с графическим интерфейсом, но нам действительно нужно что-то бесплатное, что мы могли бы упаковать с нашим продуктом.Это также должна быть командная строка или сценарий, чтобы наши клиенты могли запускать его в любой среде (Unix, Linux, Windows).

Ответы [ 4 ]

3 голосов
/ 26 августа 2010

Предполагая одну схему, что-то вроде этого - выгрузите USER_OBJECTS в таблицу перед миграцией.

 CREATE TABLE SAVED_USER_OBJECTS AS SELECT * FROM USER_OBJECTS

Затем, чтобы подтвердить после вашей миграции

 SELECT object_type, object_name FROM SAVED_USER_OBJECTS
 MINUS
 SELECT object_type, object_name FROM USER_OBJECTS

Одна из проблем заключается в том, что если вы намеренно удалили объекты между версиями, вам также необходимо удалить из SAVED_USER_OBJECTS. Также это не сработает, если существует неправильная версия объектов.

Если у вас несколько схем, то для каждой схемы требуется то же самое, ИЛИ использовать ALL_OBJECTS и извлекать / сравнивать для соответствующих пользовательских схем.

Вы также можете сделать хэш / контрольную сумму для object_type || имя_объекта для всей схемы (сохранить до / сравнить после), но стоимость вычисления не будет так же отлична от сравнения двух таблиц по индексам.

1 голос
/ 26 августа 2010

В SQL DEVELOPER (бесплатная утилита Oracle) есть функция Различия схемы базы данных.Стоит попробовать.

Надеюсь, это поможет.

SQL Developer - скачать

Рони.

1 голос
/ 26 августа 2010

Если вы готовы потратить немного, DBDiff - эффективная утилита, которая делает именно то, что вам нужно.

http://www.dkgas.com/oradbdiff.htm

0 голосов
/ 26 августа 2010

Я бы не писал сценарий проверки, я бы написал программу для генерации сценария проверки из определенной версии базы данных. Просто перейдите через метаданные и запишите, что там, и запишите это в файл, затем сравните значения в этом файле со значениями в базе данных клиента. Это не будет работать так хорошо, если вы используете сгенерированные системой имена для своих ограничений, но, вероятно, достаточно просто проверить, что что-то есть. Удаление баз данных и индексов довольно распространено при переносе базы данных, поэтому вам даже не нужно слишком много проверять; если две или три вещи отсутствуют, то вполне разумно предположить, что все они отсутствуют. Возможно, вы также захотите написать скрипт, который удаляет все ограничения и индексы и воссоздает их, а ваши клиенты просто запускают его как шаг после миграции. Просто убедитесь, что вы отбрасываете все по имени, чтобы не удалять какие-либо пользовательские индексы, которые мог создать ваш клиент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...