Проблема запуска оператора DELETE для связанного сервера в SQL Server 2008 - PullRequest
0 голосов
/ 12 февраля 2010

У меня проблема с выполнением этого запроса:

DELETE FROM [IRPROD]..[BUDGET_USER].[GL_EXP]
WHERE FISCAL_YEAR = 2010

IRPROD - это связанный сервер с базой данных Oracle 10g. Это связано с использованием поставщика Oracle OleDB. Есть ~ 79000 записей, которые необходимо удалить. Запустив этот запрос, он удаляет 54. Повторный запуск выдает мне это сообщение об ошибке.

Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "OraOLEDB.Oracle" for linked server "IRPROD" reported an error. The provider reported an unexpected catastrophic failure.
Msg 7330, Level 16, State 2, Line 1
Cannot fetch a row from OLE DB provider "OraOLEDB.Oracle" for linked server "IRPROD".

Очевидно, что «катастрофический провал» - это нечто плохое. Но странная вещь заключается в том, что я могу запускать операторы SELECT и INSERT весь день, и это прекрасно работает. У меня есть разрешения на удаление строк. Также, если я свяжу таблицу с помощью Access, я смогу удалить записи.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 15 февраля 2010

Это поставщик OleDB и ошибка базы данных 5043675: Настройка связанного сервера работает нормально для чтения данных, но обновление или удаление данных завершается с ошибкой.

Использование патчей 5043675, 6637236

Вы можете загрузить их из службы поддержки Oracle.

0 голосов
/ 15 февраля 2010

Хорошо, это оказалось легко исправить со сложным объяснением.

Первой проблемой был устаревший драйвер Oracle. Мы использовали провайдера версии 9, поэтому я обновился до провайдера 10g, предоставленного через наш магазин OIT. Оказывается, у них есть ошибка. Поэтому я удалил его и установил провайдера 10g из Oracle, который обновляется, чтобы исправить ошибку.

Во-вторых, я изменил поле 'fiscal_year' с типа varchar2 на тип числа. Если вы отправляете оператор DELETE с WHERE (или, может быть, с любым условным предложением, я только проверил WHERE), который сравнивается с тестовым полем, то SQL Server должен выполнить удаленное сканирование таблицы, которая в основном получает данные и должна по одному удалить каждую строку. Если вы отправляете оператор DELETE с WHERE, который является числовым, то SQL Server может передать запрос непосредственно в удаленную БД без выполнения удаленного сканирования.

Надеюсь, это кому-нибудь поможет. Я нашел это методом проб и ошибок и кусочками из Интернета. Спасибо за все, что помогло в этом вопросе.

...