Подтвердить что ты не робот

Операция должна использовать обновляемый запрос. (Ошибка 3073) Microsoft Access

В некоторых запросах Microsoft Access появляется следующее сообщение: Операция должна использовать обновляемый запрос. (Ошибка 3073). Я работаю над этим, используя временные таблицы, но мне интересно, есть ли лучший способ. Все задействованные таблицы имеют первичный ключ. Здесь код:

UPDATE CLOG SET CLOG.NEXTDUE = (
    SELECT H1.paidthru 
    FROM CTRHIST as H1
    WHERE H1.ACCT = clog.ACCT AND
    H1.SEQNO = (
        SELECT MAX(SEQNO) 
        FROM CTRHIST 
        WHERE CTRHIST.ACCT = Clog.ACCT AND 
        CTRHIST.AMTPAID > 0 AND
        CTRHIST.DATEPAID < CLOG.UPDATED_ON
    )
)
WHERE CLOG.NEXTDUE IS NULL;
4b9b3361

Ответ 1

Так как Jet 4, все запросы, которые имеют соединение с оператором SQL, который суммирует данные, будут невосстанавливаемыми. Вы не используете JOIN, но предложение WHERE в точности эквивалентно соединению, и, таким образом, оптимизатор запросов Jet обрабатывает его так же, как и к соединению.

Я боюсь, что вам не повезло без временной таблицы, хотя, возможно, кто-то с большим знанием Jet SQL, чем я могу придумать обходной путь.

BTW, возможно, он был обновляем в Jet 3.5 (Access 97), так как многие запросы были обновляемыми, а затем обновлялись до Jet 4.

-

Ответ 2

У меня была аналогичная проблема, когда следующие запросы не работали;

update tbl_Lot_Valuation_Details as LVD
set LVD.LGAName = (select LGA.LGA_NAME from tbl_Prop_LGA as LGA where LGA.LGA_CODE = LVD.LGCode)
where LVD.LGAName is null;

update tbl_LOT_VALUATION_DETAILS inner join tbl_prop_LGA on tbl_LOT_VALUATION_DETAILS.LGCode = tbl_prop_LGA.LGA_CODE 
set tbl_LOT_VALUATION_DETAILS.LGAName = [tbl_Prop_LGA].[LGA_NAME]
where tbl_LOT_VALUATION_DETAILS.LGAName is null;

Однако использование DLookup разрешило проблему;

update tbl_Lot_Valuation_Details as LVD
set LVD.LGAName = dlookup("LGA_NAME", "tbl_Prop_LGA", "LGA_CODE="+LVD.LGCode)
where LVD.LGAName is null;

Это решение изначально было предложено в fooobar.com/questions/252794/...

Ответ 3

Задача defintely относится к использованию (в данном случае) функции max(). Любая функция агрегации, используемая во время соединения (например, для получения значения max или min или avg из объединенной таблицы), вызывает ошибку. То же самое относится к использованию подзапросов вместо объединений (как в исходном коде).

Это невероятно раздражает (и необоснованно!), поскольку это достаточно распространенная вещь, которую нужно делать. Мне также пришлось использовать временные таблицы, чтобы обойти его (вытащите агрегированное значение в таблицу temp с помощью инструкции insert, затем присоединитесь к этой таблице с вашим обновлением, а затем опустите таблицу temp).

Гленн

Ответ 4

В коде отсутствует ошибка. Но ошибка вызывается из-за следующей причины.

 - Please check weather you have given Read-write permission to MS-Access database file.

 - The Database file where it is stored (say in Folder1) is read-only..? 

Предположим, что вы сохранили базу данных (файл MS-Access) в папке только для чтения, а при запуске приложения соединение не открывается полностью. Следовательно, измените разрешение файла/его разрешение на папку, например, в C:\Program files, все большинство файлов c cd установлены только для чтения, поэтому изменение этого разрешения разрешает эту проблему.

Ответ 5

Я знаю, что мой ответ за 7 лет, но здесь мое предложение в любом случае:

Когда Access жалуется на запрос UPDATE, который включает JOIN, просто сохраните запрос, а свойство RecordsetType установлено в Dynaset (Inconsistent Updates).

Это иногда позволяет UPDATE работать.

Ответ 6

Я бы попытался создать запрос UPDATE в Access. У меня был запрос UPDATE, который я написал себе как

UPDATE TABLE1
SET Field1 = 
(SELECT Table2.Field2
 FROM Table2
 WHERE Table2.UniqueIDColumn = Table1.UniqueIDColumn)

Запрос дал мне ту ошибку, которую вы видите. Однако это работало на моем SQL Server, но, как и в предыдущих ответах, синтаксис Access UPDATE не является стандартным синтаксисом. Однако, когда я перестроил его с помощью мастера запросов Access (он использовал синтаксис JOIN), он работал нормально. Обычно я просто делаю запрос UPDATE транзитной для использования синтаксиса не JET, но одна из таблиц, с которыми я соединялась, была локальной таблицей Access.

Ответ 7

Это происходит, когда нет ключа UNIQUE MS-ACCESS для обновляемой таблицы (таблиц). (Независимо от схемы SQL).

При создании ссылок MS-Access для SQL-таблиц вам предлагается указать индекс (ключ) во время ссылки. Если это сделано неправильно или вообще нет, запрос к связанной таблице не обновляется

При связывании таблиц SQL в Access MAKE УВЕРЕНА, что, когда Access запрашивает у вас индекс (ключ), вы используете именно то, что использует SQL, чтобы избежать проблем, хотя указание любого уникального ключа - это все, что необходимо для обновления таблицы.

Если вы не были человеком, который первоначально связал таблицу, удалите связанную таблицу с MS-ACCESS (ссылка удаляется только) и повторно привяжите ее, указав ключ правильно, и все будет работать правильно.

Ответ 8

(Немного поздно вечеринке...)

В прошлом я столкнулся с тремя способами:

  • Ссылка на текстовое поле в открытой форме
  • DSum
  • DLookup

Ответ 9

У меня была такая же проблема.

Мое решение состоит в том, чтобы сначала создать таблицу из неперерабатываемого запроса, а затем выполнить обновление из таблицы в таблицу и работать.

Ответ 10

Мину не удалось выполнить простую инструкцию INSERT. Исправлено при запуске приложения с доступом "Запуск от имени администратора" .

Ответ 11

MS Access - объединение таблиц в запрос на обновление... как сделать его обновляемым

  • Откройте запрос в режиме просмотра
  • Нажмите один раз на ссылку b/w tables/view
  • В окне "Свойства" измените значение "уникальные записи" на "да"
  • Сохраните запрос как запрос обновления и запустите его.

Ответ 12

В сущности, хотя ваш SQL выглядит вполне разумным, Jet никогда не поддерживал синтаксис SQL стандарта для UPDATE. Вместо этого он использует свой собственный проприетарный синтаксис (отличный от синтаксиса UPDATE SQL Server), который очень ограничен. Часто, обходные пути "Операция должна использовать обновляемый запрос" очень болезненны. Серьезно подумайте о переходе на более надежный SQL-продукт.

Более подробную информацию о ваших конкретных проблемах и некоторых возможных обходных решениях см. в Обновить запрос на основе итоговых запросов результатов.

Ответ 13

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

Филип Стилианос

Ответ 14

Я продолжал получать ту же ошибку, но все SQL-запросы выполняются в Access очень хорошо.

и когда я изменил разрешение AccessFile.

проблема исправлена ​​!!

Я предоставляю ' Сетевое обслуживание' полное управление правами доступа, эта учетная запись, если для IIS

Ответ 15

Когда я получил эту ошибку, возможно, из-за неправильного синтаксиса UPDATE, но после того, как я исправил запрос на обновление, я снова получил ту же ошибку... поэтому я пошел в ODBC Data Source Administrator и обнаружил, что мое соединение был доступен только для чтения. После того, как я установил соединение для чтения-записи и повторного подключения, он работал нормально.

Ответ 16

Сегодня в моем MS-Access 2003 с таблицей ODBC, указывающей на SQL Server 2000 с паролем sa, я получил ту же ошибку.
Я определил первичный ключ в таблице в базе данных SQL Server, и проблема исчезла.

Ответ 17

Здесь есть другой сценарий. Файл, который был проверен с помощью Visual Source Safe, для тех, кто все еще использует его, который не был указан "Writeablity", либо в опции "Вид", либо "Выход", также получит это сообщение об ошибке.

Решение состоит в том, чтобы повторно загрузить файл из Source Safe и применить параметр Writeability.

Ответ 18

Вы всегда можете написать код в VBA, который обновляется аналогичным образом. У меня тоже была эта проблема, и в моем обходном пути был сделан выборный запрос со всеми объединениями, в котором были все данные, которые я искал, чтобы обновлять их, делая этот набор записей и повторяя запрос обновления повторно как запрос на обновление только таблица обновлений, только поиск критериев, которые вы ищете

    Dim updatingItems As Recordset
    Dim clientName As String
    Dim tableID As String
    Set updatingItems = CurrentDb.OpenRecordset("*insert SELECT SQL here*");", dbOpenDynaset)
    Do Until updatingItems .EOF
        clientName = updatingItems .Fields("strName")
        tableID = updatingItems .Fields("ID")
        DoCmd.RunSQL "UPDATE *ONLY TABLE TO UPDATE* SET *TABLE*.strClientName= '" & clientName & "' WHERE (((*TABLE*.ID)=" & tableID & "))"
        updatingItems.MoveNext
    Loop

Я делаю это только до 60 записей в день, делая это до нескольких тысяч, может занять гораздо больше времени, поскольку запрос выполняется от начала до конца несколько раз, вместо того, чтобы просто выбирать общую группу и вносить изменения. Возможно, вам понадобится "вокруг кавычек для tableID, так как это строка, но я уверен, что это то, что сработало для меня".

Ответ 19

Чтобы еще раз ответить на то, о чем говорил DRUA в его/ее ответе...

Я разрабатываю свои базы данных в Access 2007. Мои пользователи используют время выполнения Access 2007. У них есть права на чтение в папку database_Front (front end) и права на чтение/запись в папку database_Back.

При развертывании новой базы данных пользователь не выполнил полные инструкции по копированию интерфейса на свой компьютер и вместо этого создал ярлык. Запуск Front-End через ярлык создаст условие, при котором запрос не будет обновляться из-за ограничений записи файла.

Копирование интерфейса в папку документов разрешает проблему.

Да, это усложняет ситуацию, когда пользователям приходится получать обновленную версию интерфейса, но, по крайней мере, запрос работает без необходимости использовать временные таблицы и т.д.

Ответ 20

проверьте свою БД (разрешение базы данных) и дайте полное разрешение

Перейдите в папку DB- > щелкните правой кнопкой мыши свойства- > security- > edit- > , чтобы получить полный контроль  и меню "Пуск" → run- > type "uac" уменьшают (если он высокий)

Ответ 21

Ответ, высказанный iDevlop, работал у меня. Обратите внимание, что я не смог найти свойство RecordsetType в своем запросе обновления. Тем не менее, я смог найти это свойство, изменив свой запрос на запрос select, установив это свойство как iDevlop, а затем изменив свой запрос на запрос обновления. Это сработало, нет необходимости в таблице temp.

Мне бы хотелось, чтобы это было просто комментарием к тому, что отправил iDevlop, чтобы оно вытекало из его решения, но у меня недостаточно высокий балл.