Индексированное представление MS Access

#sql #database #ms-access

#sql #База данных #ms-access

Вопрос:

Возможно ли добавить индекс в представление Ms Access?

Я пытаюсь выполнить этот запрос:

 CREATE INDEX MyCustomViewIndex ON [MyView] (MyColumn) WITH DISALLOW NULL
  

и я получаю это сообщение об ошибке.

Не удается выполнить инструкции определения данных в связанных источниках данных.

Есть предложения?

С уважением, Алекс

Редактировать:

Определение моего представления:

 create view MyView as SELECT TableA.Field1, MyUnionQuery.Field2
FROM TableA, MyUnionQuery 
  

Определение MyUnionQuery:

 Select * from ViewX
UNION select * from ViewY
  

Все таблицы находятся в одном файле MDB

Комментарии:

1. Где хранится ваша связанная таблица? Другой mdb, SQL Server, какой-то другой серверной части?

2. все задействованные таблицы и представления находятся в одном файле mdb

3. Как вы думаете, почему решение заключается в индексации представления, а не базовой таблицы, из которой представление извлекает свои данные?

Ответ №1:

Как обычно для Access (ACE, Jet, что угодно), документация расплывчата: в ней говорится о «таблицах», и, конечно, VIEW это «просматриваемая таблица», но я думаю, что в данном случае это конкретно относится к «базовым таблицам». Я сильно подозреваю, что индексы не поддерживаются для Access VIEW -ов.

Когда я пытаюсь создать его с помощью SQL DDL, я тоже получаю сообщение об ошибке «Не удается выполнить инструкции определения данных в связанных источниках данных». Вот некоторый код VBA для воспроизведения ошибки (создает новый .mdb во временной папке, ссылки не требуются, просто вставьте в модуль кода VBA, например, в Excel):

 Sub NoIndexedViews()

  On Error Resume Next
  Kill Environ$("temp") amp; "DropMe.mdb"
  On Error GoTo 0

  Dim cat
  Set cat = CreateObject("ADOX.Catalog")
  With cat
    .Create _
        "Provider=Microsoft.Jet.OLEDB.4.0;" amp; _
        "Data Source=" amp; _
        Environ$("temp") amp; "DropMe.mdb"
    With .ActiveConnection

      Dim Sql As String
      Sql = _
      "CREATE TABLE T (col1 INTEGER);"
      .Execute Sql

      Sql = _
      "CREATE VIEW V (col1) AS SELECT col1 FROM T;"
      .Execute Sql

      On Error Resume Next

      Sql = _
      "CREATE INDEX idx ON V (col1) WITH DISALLOW NULL"
      .Execute Sql

      MsgBox Err.Description

    End With
    Set .ActiveConnection = Nothing
  End With
End Sub
  

У меня нет каких-либо связанных источников данных в моем .mdb, поэтому я делаю вывод, что отображаемая ошибка является ложной и вводит в заблуждение. Но факт остается фактом, индекс не может быть создан в Access VIEW .

Комментарии:

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

2. @David-W-Fenton: Да, вы имеете в виду свойство Оптимизировать поле набора записей. Это используется для ускорения вызовов методов поиска и фильтрации набора записей. Однако обратите внимание, что OP пытается создать NOT NULL ограничение для VIEW (он же объект запроса).

3. Я не понимаю, почему вы не хотели бы, чтобы этот индекс, который запрещает значения Null, находился в базовом поле, а не в ПРЕДСТАВЛЕНИИ. Если это необходимо для ПРЕДСТАВЛЕНИЯ, почему это также не было бы необходимо в базовой таблице?

Ответ №2:

Согласно сообщению об ошибке, это связанный источник данных. Это означает, что таблица находится не внутри access, а связана внутри.

Поскольку Access не управляет таблицей, он не может выполнить запрошенную операцию.

Где находится таблица, из которой поступают данные?

Комментарии:

1. все объекты находятся в одном файле MDB