Как искать строку во всей базе данных? - PullRequest
1 голос
/ 11 февраля 2009

У меня есть база данных informix, состоящая из большого количества таблиц.

Я знаю, что где-то внутри таблицы есть строка "пример", но не знаю, какая это таблица или какой это столбец. (Я знаю, что это очень редкий случай)

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

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 12 февраля 2009

В Informix определить столбцы, содержащие символьные данные, довольно сложно, но выполнимо. К счастью, вы вряд ли будете использовать эзотерические функции, такие как DISTINCT TYPE, которые затруднят поиск. (Предложение Альфадога о выгрузке - использование dbexport, как я отмечаю в своем комментарии к его ответу - имеет смысл, особенно если текст может появиться в поле CLOB или TEXT.) Вам нужно знать, что типы CHAR, NCHAR, VARCHAR, NVARCHAR и LVARCHAR имеют номера типов 0, 13, 15, 16 и 43. Кроме того, если столбец NOT NULL, к числу добавляется 256. Следовательно, столбцы символьных данных в базе данных находятся с помощью этого запроса:

SELECT t.owner, t.tabname, c.colname, t.tabid, c.colno
    FROM "informix".systables t, "informix".syscolumns c
    WHERE t.tabid = c.tabid
      AND c.coltype IN (0, 13, 15, 16, 43, 256, 269, 271, 272, 299)
      AND t.tabtype = 'T'  -- exclude views, synonyms, etc.
      AND t.tabid  >= 100  -- exclude the system catalog
    ORDER BY t.owner, t.tabname, c.colno;

Генерирует список мест для поиска. Вы можете получить фантазию, и SELECT сгенерирует строку, подходящую для повторной отправки в качестве запроса - это оставлено в качестве упражнения для читателя.

2 голосов
/ 11 февраля 2009

Как правило, у вас есть два подхода.

Один из способов - сбросить каждую таблицу в отдельные текстовые файлы и выполнить grep-файлы. Это можно сделать вручную в небольшой базе данных или с помощью сценария в случае более крупной базы данных. Посмотри в РАЗГРУЗКУ и dbaccess. Пример скрипта BASH: (вам нужно сгенерировать список таблиц в скрипте либо статически, либо с помощью запроса.)

unload_tables () {

for table in ${TABLE_LIST} do
    dbaccess database_name << EOF
    unload to "${OUT_PATH}/${table}/.out"
    select * from $table;
    EOF
done
}

Или это немного сложнее. Вы можете создать определенный SELECT (фильтруя каждый столбец по «примеру») для каждой таблицы и столбца в вашей БД аналогичным автоматическим способом, используя systables и syscolumns, а затем запустить каждый sql.

Например, этот запрос показывает все столбцы во всех таблицах:

SELECT tabname, colno, colname, coltype, collength
FROM systables a, syscolumns b 
WHERE a.tabid = b.tabid

Легко адаптировать это так, что SELECT возвращает правильную отформатированную строку SQL, которая позволяет запрашивать базу данных на соответствие «примеру». Извините, у меня нет полного решения наготове, но если вы поищите в Google сообщение "systables informix systables", вы увидите множество способов использования этой информации.

...