Проблема с запросом MS Access после операции «Сжатие и восстановление» - PullRequest
3 голосов
/ 09 июня 2009

У меня есть приложение Access, которое использует классический подход front-end / back-end. Вчера бэкэнд был поврежден по причине, которую я не знаю. Поэтому я открыл бэкэнд с Access 2003 и access спросил меня, не хочу ли я восстановить файл, я сказал «да» и, похоже, он работает.

Я могу открыть базу данных, просмотреть содержимое таблиц и выполнить большинство запросов.

Однако есть запрос на доступ, который не работает с конкретным предложением where.

Пример:

// This works in the original DB, but not in the compacted one :
SELECT a, b, c 
FROM tbl1 INNER JOIN tbl2 ON tbl1.d = tbl2.d 
WHERE e = 3 AND tbl2.f = 1;

// This works in both the original and the compacted one :
SELECT a, b, c 
FROM tbl1 INNER JOIN tbl2 ON tbl1.d = tbl2.d 
WHERE e = 3;

Когда я пытаюсь выполнить запросы, ничего не происходит. Процесс доступа начинает использовать большую часть процессора, а графический интерфейс перестает отвечать на запросы. Если я запускаю запрос из редактора запросов, я могу использовать Ctrl + Break, чтобы остановить выполнение. Я пытался уделить запросу много времени, но это не помогло.

Я проверил план выполнения в showplan.out, и он кажется правильным (по крайней мере, выполнение не должно длиться вечно)

Я снова попытался сжать БД. Я пытался импортировать таблицы в новой БД. Я даже пытался импортировать таблицы и их данные в файл mdb, который был теперь в хорошем состоянии (из резервной копии).

У кого-нибудь есть идея?

Ответы [ 5 ]

4 голосов
/ 10 июня 2009

Похоже, что индекс поврежден, и когда это происходит, он сбрасывается во время сжатия. Проверьте системную таблицу с именем MSysCompactErrors - вам придется показывать скрытые объекты и / или системные объекты в Сервис | Варианты | VIEW.

Никогда не сжимайте Jet MDB без предварительного резервирования. Из-за этого правила функция COMPACT ON CLOSE совершенно бесполезна, поскольку ее нельзя отменить, поэтому вы всегда должны быть уверены, что она отключена во всех MDB.

1 голос
/ 09 июня 2009

Я не знаю, какой тип метаданных приносит Access, когда импортирует таблицу из одной базы данных в другую. Если метаданные повреждены, импорт таблицы в другую базу данных не обязательно решит проблему. Если это возможно, вы можете попробовать создать таблицы с нуля в новой базе данных, а затем просто экспортировать и импортировать (или скопировать и вставить добавленные) данные в новую базу данных.

Я никогда не видел, чтобы таблица была так повреждена в такой маленькой базе данных, хотя с Access все возможно. Может быть что-то не так с данными?

0 голосов
/ 10 июня 2009

Есть ли индекс по полю tbl2.f?

Также попробуйте зайти в эту таблицу в виде таблицы, отсортируйте tbl2.f по возрастанию и посмотрите, есть ли что-то действительно странное в первой или последней записи.

0 голосов
/ 09 июня 2009

У вас есть доступ к установке SQL Server? Вы можете использовать Мастер повышения в меню Сервис -> Утилиты базы данных, чтобы скопировать данные на SQL Server и посмотреть, не возникнет ли там такая же проблема.

0 голосов
/ 09 июня 2009

Я бы попробовал заново создать запрос (новое имя и т. Д.) И посмотреть, что произойдет.

Вы даже можете попробовать скопировать его (даже в той же БД или в совершенно новую). Если это работает, в худшем случае вы должны скопировать все объекты в новую БД.

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