Почему нам нужно удалять таблицы, чтобы заново связать их?

Я использую этот код для прикрепления таблицы без DSN.

'//Name     :   AttachDSNLessTable
'//Purpose  :   Create a linked table to SQL Server without using a DSN
'//Parameters
'//     stLocalTableName: Name of the table that you are creating in the current database
'//     stRemoteTableName: Name of the table that you are linking to on the SQL Server database
'//     stServer: Name of the SQL Server that you are linking to
'//     stDatabase: Name of the SQL Server database that you are linking to
'//     stUsername: Name of the SQL Server user who can connect to SQL Server, leave blank to use a Trusted Connection
'//     stPassword: SQL Server user password
Function AttachDSNLessTable(stLocalTableName As String, stRemoteTableName As String, stServer As String, stDatabase As String, Optional stUsername As String, Optional stPassword As String)
    On Error GoTo AttachDSNLessTable_Err
    Dim td As TableDef
    Dim stConnect As String

    For Each td In CurrentDb.TableDefs
        If td.Name = stLocalTableName Then
            CurrentDb.TableDefs.Delete stLocalTableName
        End If
    Next

    If Len(stUsername) = 0 Then
        '//Use trusted authentication if stUsername is not supplied.
        stConnect = "ODBC;DRIVER=SQL Server;SERVER = " & stServer & ";DATABASE = " & stDatabase & ";Trusted_Connection=Yes"
    Else
        '//WARNING: This will save the username and the password with the linked table information.
        stConnect = "ODBC;DRIVER=SQL Server;SERVER = " & stServer & ";DATABASE = " & stDatabase & ";UID = " & stUsername & ";PWD = " & stPassword
    End If
    Set td = CurrentDb.CreateTableDef(stLocalTableName, dbAttachSavePWD, stRemoteTableName, stConnect)
    CurrentDb.TableDefs.Append td
    AttachDSNLessTable = True
    Exit Function

AttachDSNLessTable_Err:

    AttachDSNLessTable = False
    MsgBox "AttachDSNLessTable encountered an unexpected error: " & Err.Description

End Function

Предположим, я изменил схему связанных таблиц с помощью ADO:

cn.execute "Alter table table 1 add add Name string not null"

Я знаю, что это изменит таблицу в SQL Server.

Я думал, что связанные таблицы в MS Access всегда отражают любые изменения, внесенные в таблицы в SQL Server. Почему нам нужно удалить локальную таблицу и заново связать ее, чтобы отразить изменения схемы?

Это неприятный аспект работы с источниками данных ODBC, и нет другого выхода, кроме обновления связанных таблиц.

Martin 18.12.2018 00:03

Почему изменения данных отражаются, а изменения схемы - нет?

namko 18.12.2018 00:11

Диспетчер связанных таблиц в пользовательском интерфейсе Access позволяет обновлять связанные таблицы, не удаляя их. Я не уверен, что делает «освежение», поскольку оно вполне может удалять и повторно добавлять их за укрытием, но, похоже, это не то, что он делает. Проверяли ли вы документацию TableDef на предмет метода обновления связанной схемы? См. Метод DAO TableDef.RefreshLink

C Perkins 18.12.2018 00:13

Хорошо, из того, что я нашел, вы можете обновить ссылку. Но я нашел ответ в сообщении это, в котором говорилось, что «потому что таблицы, связанные ODBC, плохо обновляются для SQL Server. Я бы удалил все ссылки на таблицы и воссоздал их с нуля». В основном для Access с MS Access с обновлением серверной части SQL по сравнению с удалением и повторным связыванием происходит то же самое. Сказав, что этот ответ не дал никакой дополнительной информации о том, почему это происходит, я не уверен.

namko 18.12.2018 01:05

Не верьте всему, с чем сталкиваетесь. Метод Refresh - это все, что вам нужно, и он работает безупречно.

Gustav 18.12.2018 09:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
263
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Простой ответ заключается в том, что только изменения схемы сохраняются и собираются во время компоновки из соображений производительности.

Связанная таблица не имеет возможности узнать, что структура таблицы была изменена, до тех пор, пока вы не укажете Access для проверки (просто обновив таблицу).

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

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

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

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

Получение данных из таблицы - впечатляющее и серьезное отличие проблемы от запроса sql-сервера на отправку всей структуры таблицы. (И что, если бы это было так - вам ВСЕГДА придется обновлять локальную информацию).

Я имею в виду, что в моей форме может быть 2 поля из 150. Зачем мне нужно, чтобы вся эта масса информации спускалась по сетевому каналу только для отображения двух текстовых полей в форме? Почему 150 столбцов информации (имя, длина, тип данных, автоматический номер и т. д., Индексирование должны падать каждый раз)?

Вы видели таблицу соответствия для каждого столбца в sql? Это довольно большой объем информации. Фактически, эта информация представляет собой довольно большой объем данных, когда у вас есть 100 или более столбцов. Информация, отправленная по сетевому каналу, будет БОЛЬШЕ, чем данные, содержащиеся в одной небольшой записи, которую вы редактируете !!!

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

Фактически, даже другие представления на сервере sql могут с трудом обновляться при изменении представления. В результате даже запросы на запросы (представления на представлениях) ДАЖЕ при использовании чистого sql-сервера часто необходимо «сообщать», что структура данных и столбцы, с которых вы изначально начали, были изменены.

Таким образом, связанные таблицы в Access не сильно отличаются от сохраненных представлений на сервере sql. Если вы обновляете базовые таблицы, вам необходимо выполнить команду sp_refeshview на сервере sql, чтобы обновить представление, чтобы узнать об этих изменениях.

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

Таким образом, информация о схеме сохраняется во время связывания, и воссоздание и построение схемы не происходит просто «с использованием» связанной таблицы. У вас есть доступ к перезагрузке схемы при внесении изменений.

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

Поскольку для 99,9% извлечения данных схема не меняется, поэтому все эти накладные расходы на извлечение и тестирование схемы каждый раз не имеют большого смысла (это было бы плохой идеей и дизайном).

Как уже отмечалось, даже если не используется Access и используются представления на сервере sql, которые указывают на существующие таблицы, схема сохраняется в этом представлении до тех пор, пока вы не обновите это представление.

И эта проблема и проблема, конечно же, не ограничивается доступом к серверной части доступа или доступом к серверной части sql. Большинство продуктов баз данных просто не обновляют неожиданно такие вещи, как представления, которые сохраняют исходную схему из соображений производительности.

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

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

Изменения схемы также довольно редки. Если они возникают часто, значит, что-то не так с разработчиками, а не с системой баз данных.

Другие вопросы по теме