MyTetra Share
Делитесь знаниями!
Описание системных таблиц MS Access
Время создания: 10.10.2019 07:24
Текстовые метки: Access
Раздел: Разные закладки - MSO - Access
Запись: xintrea/mytetra_db_adgaver_new/master/base/1570681473s9j5plzbvc/text.html на raw.githubusercontent.com

В этой статье хочу рассказать о системных таблицах 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);

создания подчиненных запросов внутри подчиненных запросов (вложенные запросы)

Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования