В этой статье хочу рассказать о системных таблицах MS Access - для чего они нужны, что в них содержиться и какую (порой весьма интересную) информацию можно из них извлечь. Поскольку, к сожалению, я нигде не смог найти описаний этих таблиц приведенная ниже информация была получена мной исключительно в процессе экспериментов над ними. Так что не исключено, что есть какие-то неточности или ошибочные выводы. Ну и, естественно, ни в коем разе не претендую на полноту изложенной информации.
MS Access имеет семь ситемных таблиц: MSysACEs, MSysCmdbars, MSysModules, MSysModules2, MSysObjects, MSysQueries и MSysRelationships.
Таблица MSysObjects.
На мой взгляд - самая "важная" таблица. Содержит информацию об объектах базы данных.
Эта таблица имеет следующие поля:
Имя поля |
Тип поля |
Connect |
Поле МЕМО |
Database |
Поле МЕМО |
DateCreate |
Дата/время |
DateUpdate |
Дата/время |
Flags |
Числовой |
ForeignName |
Текстовый (255) |
Id |
Числовой (Long Int) |
Lv |
Поле объекта OLE |
LvExtra |
Поле объекта OLE |
LvModule |
Поле объекта OLE |
LvProp |
Поле объекта OLE |
Name |
Текстовый (255) |
Owner |
Двоичный (255) |
ParentId |
Числовой (Long Int) Prim.key |
RmtInfoLong |
Поле объекта OLE |
RmtInfoShort |
Двоичный (255) |
Type |
Числовой (Integer) |
Id -ключевое поле. Содержит уникальный идентификатор для каждого объекта БД.
ParentId -значение Id "родительского" объекта. Например если объект "Forms" имеет Id = -2147483648, то все формы будут иметь "-2147483648" в поле ParentId. Стоит заметить, что у всех запросов и таблиц БД один и тот же "родитель" - "Tables".
Type - тип объекта БД. Вот значения этого поля для некоторых типов объектов:
Тип объекта БД |
Значение поля Type |
"Родные" таблицы (в том числе и системные) |
|
Глобальные "семейства" объектов (Relationships, Databases, Tables, Modules, SysRel, Scripts, Forms, Reports) |
|
Запросы (в том числе и те, которые на самом деле являются SQL-выражениями в источниках данных форм, отчетов, элементов управления и т.д.) |
|
Прилинкованные таблицы |
|
Формы |
-32768 |
Отчеты |
-32764 |
Макросы |
-32766 |
Модули (в том числе модули классов) |
-32761 |
Name - имя объекта. Для запросов, которые на самом деле являются SQL-выражениями источников записей это имя стоится по определенным правилам:
- Источник записей формы (префикс ~sql_f): ~sql_fИмяФромы
Для источника записей формы с именем Form1 это имя будет ~sql_fForm1
- Источник записей отчета (префикс ~sql_r): ~sql_rИмяОтчета
Для источника записей отчета с именем Report1 это имя будет ~sql_rReport1
- Источник строк элемента управления (например списка) формы (префикс ~sql_c): ~sql_cИмяФормы~sql_cИмяЭлементаУправления
Для элемента управления с именем MyListBox1 в форме с именем Form1 это имя будет ~sql_cForm1~sql_cMyListBox1
- Источник строк элемента управления (например списка) отчета (префикс ~sql_d): ~sql_dИмяОтчета~sql_dИмяЭлементаУправления
Для элемента управления с именем MyListBox1 в отчета с именем Report1 это имя будет ~sql_dReport1~sql_dMyListBox1
ForeignName- для прилинкованных таблиц в этом поле содержиться "реальное" имя таблицы. Например если талица с имем Table1 прилинкована с именем MyTable1, то в поле Name будет MyTable1, а в поле ForeignName - Table1. А для прилинкованного документа Excel в этом поле будет имя листа - например Лист1$.
Database -для прилинкованных таблиц в этом поле содержиться полный путь и имя файла, откуда была прилинкована таблица. Для прилинкованных Access-ных таблиц это будет, например, D:\DBases\MyBase.mdb, а для Excel-еских - C:\MyDocuments\Raspisanie.xls.
Connect -для прилинкованныз НЕ-Access-ных таблиц в этом поле содержиться значение свойства Connect. Например для Excel это будет Excel 5.0;HDR=NO;IMEX=2;
DateCreate -дата и время создания объекта.
DateUpdate -дата и время обновления объекта.
Для чего нужны остальные поля этой таблицы - не знаю.
А теперь посмотрим, какие данные мы можем получить из этой таблицы:
Что можем получить |
SQL |
Список "родных" таблиц |
SELECT MSysObjects.Id, MSysObjects.Name FROM MSysObjects WHERE (((MSysObjects.Type)=1) AND ((Left([Name],4))<>"MSys" And (Left([Name],4))<>"USys")); |
Список присоединенных таблиц |
SELECT MSysObjects.Id, MSysObjects.Name FROM MSysObjects WHERE (((MSysObjects.Type)=6) AND ((Left([Name],4))<>"MSys" And (Left([Name],4))<>"USys")); |
Список "родных" и присоединенных таблиц |
SELECT MSysObjects.Id, MSysObjects.Name, MSysObjects.Type FROM MSysObjects WHERE (((MSysObjects.Type)=1 Or (MSysObjects.Type)=6) AND ((Left([Name],4))<>"MSys" And (Left([Name],4))<>"USys")); |
Список запросов |
SELECT MSysObjects.Id, MSysObjects.Name FROM MSysObjects WHERE (((Left([Name],4))<>"~sq_") AND ((MSysObjects.Type)=5)); |
Список форм |
SELECT MSysObjects.Id, MSysObjects.Name FROM MSysObjects WHERE (((MSysObjects.Type)=-32768)); |
Список отчетов |
SELECT MSysObjects.Id, MSysObjects.Name FROM MSysObjects WHERE (((MSysObjects.Type)=-32764)); |
Список макросов |
SELECT MSysObjects.Id, MSysObjects.Name FROM MSysObjects WHERE (((MSysObjects.Type)=-32766)); |
Список модулей |
SELECT MSysObjects.Id, MSysObjects.Name FROM MSysObjects WHERE (((MSysObjects.Type)=-32761)); |
Список форм, имеюших выражение SQL в источнике |
SELECT MSysObjects_1.Id AS [Id Форм], Right([MSysObjects]![Name],Len([MSysObjects]![Name])-5) AS [Имя формы], MSysObjects.Id AS [Id Запроса] FROM MSysObjects, MSysObjects AS MSysObjects_1 WHERE (((Right([MSysObjects]![Name],Len([MSysObjects]![Name])-5))= [MSysObjects_1]![Name]) AND ((Left([MSysObjects]![Name],5))="~sq_f") AND ((MSysObjects.Type)=5) AND ((MSysObjects_1.Type)=-32768)); |
Список отчетов, имеюших выражение SQL в источнике |
SELECT MSysObjects_1.Id AS [Id Отчета], Right([MSysObjects]![Name],Len([MSysObjects]![Name])-5) AS [Имя отчета], MSysObjects.Id AS [Id Запроса] FROM MSysObjects, MSysObjects AS MSysObjects_1 WHERE (((Right([MSysObjects]![Name], Len([MSysObjects]![Name])-5))=[MSysObjects_1]![Name]) AND ((Left([MSysObjects]![Name],5))="~sq_r") AND ((MSysObjects.Type)=5) AND ((MSysObjects_1.Type)=-32764)); |
Список элементов управления форм, имеюших выражение SQL в источнике |
SELECT MSysObjects_1.Id, Mid([MSysObjects]![Name],6,InStr(2,[MSysObjects]![Name],"~sq_c")-6) AS [Имя формы], Mid([MSysObjects]![Name],InStr(2,[MSysObjects]![Name],"~sq_c")+5) AS [Имя элемента] FROM MSysObjects AS MSysObjects_1, MSysObjects WHERE (((Mid([MSysObjects]![Name],6,InStr(2,[MSysObjects]![Name], "~sq_c")-6))=[MSysObjects_1]![Name]) AND ((Left([MSysObjects]![Name],5))="~sq_c") AND ((MSysObjects.Type)=5) AND ((MSysObjects_1.Type)=-32768)); |
Список элементов управления отчетов, имеюших выражение SQL в источнике |
SELECT MSysObjects_1.Id, Mid([MSysObjects]![Name],6,InStr(2,[MSysObjects]![Name],"~sq_d")-6) AS [Имя отчета], Mid([MSysObjects]![Name],InStr(2,[MSysObjects]![Name],"~sq_d")+5) AS [Имя элемента] FROM MSysObjects, MSysObjects AS MSysObjects_1 WHERE (((Mid([MSysObjects]![Name],6,InStr(2,[MSysObjects]![Name], "~sq_d")-6))=[MSysObjects_1]![Name]) AND ((Left([MSysObjects]![Name],5))="~sq_d") AND ((MSysObjects.Type)=5) AND ((MSysObjects_1.Type)=-32764)); |
Подчиненный запрос представляет собой инструкцию SQL SELECT, вложенную в запрос на выборку или запрос на изменение. Чтобы определить новое поле, данную инструкцию можно ввести в строку Поле в бланке запроса. Чтобы указать для данного поля условие отбора, введите инструкцию в строку Условие отбора. Подчиненные запросы используются для следующего:
проверка наличия результатов подчиненного запроса (используются зарезервированные слова EXISTS или NOT EXISTS);
поиск значений в основном запросе, которые равны, превышают или меньше значений, возвращаемых подчиненным запросом (используются зарезервированные слова ANY, IN или ALL);
создания подчиненных запросов внутри подчиненных запросов (вложенные запросы)
|