Реализация системного каталога. Основные хранимые характеристики: отношения, атрибуты с типами связи, индексы

 











Курсовая работа

по дисциплине

Базы данных

тема:

Реализация системного каталога. Основные хранимые характеристики: отношения, атрибуты с типами, связи, индексы



Содержание


Введение

. Постановка задачи

. Описание решения

. Описание интерфейса приложения

Заключение

Список использованной литературы

Приложение А (обязательное)- Листинг программы


Введение


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

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

Каталог состоит из таблиц. Их называют системными таблицами для отличия от обычных пользовательских. В результате пользователь может обращаться к каталогу так же, как к своим данным. Например, в каталоге обычно содержатся системные таблицы TABLES и COLUMNS, назначение которых - описание известных системе таблиц и столбцов этих таблиц.

Содержимое системного каталога может включать информацию по следующим разделам:

·учетные записи пользователей и установки по умолчанию;

·привилегии и другая связанная с безопасностью информация;

·статистика, характеризующая производительность системы;

·размеры объектов;

·динамика роста объектов;

·структура таблиц и параметры их хранения;

·структура индексов и параметры их хранения;

·информация о других объектах базы данных, в частности, представлениях, синонимах, триггерах, сохраненных процедурах;

·ограничения для таблиц и информация о ссылочной целостности данных;

·пользовательские сеансы доступа;

·информация об аудитах;

·внутренние параметры базы данных;

·размещение файлов базы данных;

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

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

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

·написание подпрограмм, реализующих ввод таблиц, полей и ключей;

·написание подпрограмм, создающих системный каталог;

·создание приложения, позволяющего добавлять таблицы, поля и ключи, а также выводить данные из системного каталога;



1. Постановка задачи


Задача данной курсовой работы заключается в реализации системного каталога, основными хранимыми характеристиками которого являются отношения, атрибуты с типами, связи, индексы. Кроме того необходимо реализовать интерфейс для других работ, а именно для введения таблиц (отношений), полей таблиц, ключей (первичный и внешние).

Программа должна быть реализована средствами языка Delphi.


2. Описание решения


Содержимое каталога состоит из следующих файлов: файл таблиц, файл полей, файл ключей, файл индексов.

Файл таблиц - tables.txt, состоит из строк, в каждой из которых находится имя таблицы.

Файл полей - field.txt, состоит из строк, каждая из которых имеет следующий формат:


<Имя таблицы>|<Имя поля>|<Тип данных>|<Длина типа данных>


Файл ключей - keys.txt, состоит из строк, каждая из которых имеет структуру следующего вида:


<Имя таблицы>|<Первичный ключ>|<Внешний ключ 1>|


При этом Внешний ключ состоит из пар вида:


<Foreign>|<References>


Файл индексов - index.txt, состоит из строк следующего вида:


<Имя индекса>|<Имя таблицы>|<Имя поля>|


Модуль MyFunction содержит процедуры и функции необходимые для работы с системным каталогом. Процедуры AddTable, AddField, AddKey, AddIndex осуществляют запись таблиц, полей, ключей и индексов в соответствующие файлы, на основании введенных пользователем данных. Процедура AddTable реализована следующим образом.


procedure AddTable(NameTable: string);(Tables,PathToTables);(Tables);(Tables,NameTable);

CloseFile(Tables);;


В качестве входного параметра выступает имя таблицы. Далее следует обращение к стандартным процедурам AssignFile и Append. AssignFile связывает файловую переменную с именем файла, Append - инициирует запись в существующий файл. Процедуры AddField, AddIndex реализованы анадогично.

Процедура AddKey позволяет вводить первичные ключи и внешние ключи, в зависимости от выбора режима пользователем. Переменная Logic типа boolean показывает, осуществлялись ли ранее записи в файл. Алгоритм этой процедуры представлен на рисунке 1.

Функции InTable, InField, InKey имеют выходное значение типа boolean. Они проверяют наличие соответствующего элемента во введенных данных.

Функции InTable в качестве параметра получает имя таблицы, наличие которой в файле Tables необходимо проверить. Далее выполняются процедуры открытия файла, считывается строка из файла и проверяется ее совпадение с входным параметром. В случае совпадения их значений функция принимает значение True, иначе - False.

Функция InField имеет два параметра: имя таблицы NameTable и имя поля NameField. Данная функция работает следующим образом. Получаем стоку из файла Field. Вид этой строки таков, что сначала записано имя таблицы, а затем принадлежащее ей поле с указанием типа и его размера. Проверяем равенство входного параметра NameTable и первых символов строки, содержащих имя поля, в случае равенства проверяем также соответствие параметра NameField имени поля в данной строке файла. Таким образом просматриваем все строки файла. Функция принимает значение True в том случае если оба параметра совпали с информацией в строке файла.

Функция InKey проверяет существования ключа у таблицы. Имеет 2 входных параметра: NameTable и Why. Результат функции формируется следующим образом. В случае обнаружения в файле Keys записи соответствующей паре значений NameTable и Why функция возвращает значение True, которое свидетельствует о наличии первичного либо внешнего ключа у таблицы. В противном случае возвращается значение False, что говорит об отсутствии ключа с данным именем у таблицы.

Эти функции используются для проверки корректности ввода данных пользователем.

Значения функций FSpisokTables, FSpisokField, FSpisokKeys типа string содержат строку с содержимым соответствующего файла. Формат возвращаемого результата этих функций следующий: каждая строка файла отделена от последующей знаком &. Все эти функции реализованы аналогичным образом. Схема функций представлена на рисунке 2.

Функция FPrintStr возвращает содержимое каталога строкой. В этой строке последовательно представлена информация каталога по каждой таблице, разделенная знаком &. Алгоритм это функции представлен на рисунке 3.

Процедура PrintData использует функцию FPrintStr и на основе ее результата выводит все поля заданной пользователем таблицы в текстовую таблицу StringGrid. Алгоритм работы этой процедуры можно записать следующим образом:

1.SpisokPrint:= FPrintStr;

2.Находим информацию в строке SpisokPrint о требуемой таблице;

.Заносим имя требуемой таблицы в StringGrid;




Рисунок 1 - Алгоритм процедуры AddKey

Рисунок 2 - Схема функций FSpisokTables, FSpisokField, FSpisokKeys


4.Находим информацию о ключах таблицы и заносим в StringGrid;

5.В переменную Column заносим имена всех полей и записываем в таблицу StringGrid;

.В переменную ColumnType заносим типы полей и записываем в таблицу StringGrid;

Процедура PrintTables выводит имена всех содержащихся в файле Tables.txt отношений и количество полей в каждом из них. Для реализации этой процедуры просматриваем строки файла Tables и выводим из в текстовую таблицу StringGrid.




Рисунок 3 - Алгоритм функции FPrintStr


Далее, просматривая строки файла Field считаем количество полей для каждой таблицы и эти значения также выводим в текстовую таблицу. PrintRelations - процедура, осуществляющая вывод в многострочное текстовое поле Memo информацию о связях между отношениями на основе содержимого файла Keys. Результат выполнения процедуры PrintIndex - вывод в StringGrid имени индекса и его принадлежность к полю и таблице. Работа данной процедуры основывается на просмотре информации файла Index.


. Описание интерфейса приложения


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

·добавить таблицу

·добавить поле

·добавить ключ

·просмотреть каталог

В случае выбора пункта меню Добавить -> Таблицу на форме появляются однострочное текстовое поле для ввода имени таблицы и кнопка Добавить. При нажатии на нее информация о новой таблице будет занесена в файл.

При выборе пункта меню Добавить -> Поле пользователю, с помощью раскрывающегося списка, предлагается выбрать таблицу, в которое будет добавляться поле, ввести имя поля, выбрать его тип и длину типа. Состояние флага Индекс говорит о наличии или отсутствии индекса для данного поля таблицы. Пример работы приложения в таком состоянии представлена на рисунке 4.


Рисунок 4 - Пример работы приложения


Выбор пункта меню Добавить -> Ключ позволяет выбирать пользователю таблицу, куда требуется добавить ключ и его тип. В случае добавления первичного ключа, требуется ввести имя поля, которое будет однозначно идентифицировать запись таблицы. В случае выбора внешнего ключа пользователь заполняет два поля Foreign(туда записывается имя поля - внешний ключ) и References (содержит имя таблицы).

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


Рисунок 5 - Просмотр системного каталога

Рисунок 6 - Просмотр полей системного каталога



Заключение


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

·написаны подпрограммы, реализующие ввод таблиц, полей и ключей;

·написаны подпрограммы, создающие системный каталог;

·создано приложение, позволяющее добавлять таблицы, поля и ключи, а также выводить данные из системного каталога;

Поставленная в работе цель достигнута, все задачи выполнены полностью.

Список литературы


1.Швецов, В.И., Визгунов, А.Н., Мееров, И.Б. Базы данных [Текст]. - Учебное пособие. - Нижний Новгород: Издательство ННГУ, 2004.- 217 с.

.Рыженков, Д.В. Курс лекций по дисциплине «Базы данных», 2009 г.

3.Дейт, К.Дж. Введение в системы баз данных, 6-е издание [Текст]: [пер. С англ.] /К.ДЖ. ДеЙт. - М. [и др.]: Вильямс, 2000. - 848 с.; 24 см. 4000 экз. - ISBN: 5-8459-0019-0.

системный каталог ввод атрибут

Приложение А (обязательное)


Листинг программы

Unit1;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, Grids, Menus, MyFunction;= class(TForm): TMainMenu;: TMenuItem; //действие: TMenuItem; //добавить: TMenuItem; //таблицу: TMenuItem; //поле: TMenuItem; //ключ: TMenuItem; //просмотр: TMenuItem; //exit: TStringGrid;: TButton;: TEdit;: TLabel;: TComboBox;: TLabel;: TEdit;: TLabel;: TComboBox;: TLabel;: TEdit;: TLabel;: TEdit;: TLabel;: TRadioButton;: TRadioButton;: TRadioButton;: TMemo;: TRadioButton;: TCheckBox;: TEdit;N3Click(Sender: TObject);FormCreate(Sender: TObject);Button1Click(Sender: TObject);N4Click(Sender: TObject);ComboBox1DropDown(Sender: TObject);ComboBox1Change(Sender: TObject);ComboBox2Change(Sender: TObject);ComboBox1Select(Sender: TObject);N5Click(Sender: TObject);ComboBox2Select(Sender: TObject);N6Click(Sender: TObject);RadioButton1Click(Sender: TObject);RadioButton2Click(Sender: TObject);RadioButton3Click(Sender: TObject);CheckBox1Click(Sender: TObject);RadioButton4Click(Sender: TObject);N7Click(Sender: TObject);N9Click(Sender: TObject);

{ Private declarations }

{ Public declarations };: TForm1;: integer;: TextFile; //Файл таблиц: TextFile; //Файл полей: TextFile; //Файл ключей:TextFile;,SpisokField,SpisokKeys,Content,Temp,Temp1,Temp2, Temp3, Temp4:string;, Primary, Foreign, Column, ColumnType,SpisokPrint: string;:boolean;: integer;

{$R *.dfm}ClearAll;i,j:integer;.Label1.Visible:=false;.Label2.Visible:=false;.Label3.Visible:=false;.Label4.Visible:=false;.Label5.Visible:=false;.Label6.Visible:=false;.Button1.Visible:=false;.Edit1.Visible:=false;.Edit2.Visible:=false;.Edit3.Visible:=false;.Edit4.Visible:=false;.Edit5.Visible:=false;.Stringgrid1.Visible:=false;.ComboBox1.Visible:=false;.ComboBox2.Visible:=false;.RadioButton1.Visible:=false;.RadioButton2.Visible:=false;.RadioButton3.Visible:=false;.RadioButton4.Visible:=false;.Memo1.Visible:=false;.CheckBox1.Visible:=false;

;

TForm1.N3Click(Sender: TObject);;:=1;.Label1.Caption:='название таблицы';.Label1.Visible:=true;.Edit1.Text:='';.Edit1.Visible:=true;.Button1.Visible:=true;.Button1.Caption:='Добавить';TForm1.FormCreate(Sender: TObject);;;TForm1.Button1Click(Sender: TObject);i:integer;:boolean;,Temp1,Temp2:string;(MyAction=1) then

//Добавляем таблицуform1.Edit1.Text<>'' then(Form1.Edit1.Text);('Таблица добавлена');(MyAction=2) then

//Добавляем поле(ComboBox1.Text<>'Выбрать') and (Trim(Edit2.Text)<>'') and (ComboBox2.Text<>'Выбрать') then(ComboBox1.Text, Edit2.Text, ComboBox2.Text, Edit3.Text);('Поле добавлено');('Не все поля заполнены', mtError, [mbOk], 0);CheckBox1.Checked=true and (edit5.Text<>'')then(edit5.Text,ComboBox1.Text, Edit2.Text);('Индекс добавлен');;;if (MyAction=3) then

//Добавляем ключ(Trim(ComboBox1.Text)<>'Выбрать') and (Trim(ComboBox2.Text)='Primary') then(Trim(ComboBox1.Text)<>'Выбрать') and (Trim(Edit3.Text)<>'') thennot InKey(Trim(ComboBox1.Text), 'Primary') thenInField(Trim(ComboBox1.Text), Trim(Edit3.Text)) then(Trim(ComboBox1.Text), Trim(Edit3.Text), '', '', 'Primary');('Ключ добавлен');('Указанного поля не найдено в таблице '+Trim(ComboBox1.Text), mtError, [mbOk], 0)('Такой первичный ключ уже есть в таблице '+Trim(ComboBox1.Text), mtError, [mbOk], 0)('Не все поля заполнены', mtError, [mbOk], 0);if (Trim(ComboBox2.Text)='Foreign') then(Trim(ComboBox1.Text)<>'Выбрать') and (Trim(Edit3.Text)<>'') and (Trim(Edit4.Text)<>'') thenInField(Trim(ComboBox1.Text), Trim(Edit3.Text)) then:=1;:=Trim(Edit4.Text);i<=Length(Str) do if Str[i]<>'.' then inc(i) else break;i<Length(Str) then:=Copy(Str,1,i-1);:=Copy(Str,i+1,Length(Str));InField(Temp1, Temp2) then(Trim(ComboBox1.Text), '', Trim(Edit3.Text), Trim(Edit4.Text), 'Foreign');('Ключ добавлен');('Указанного поля в References '+Temp2+' не найдено в таблице '+Temp1, mtError, [mbOk], 0)('Неправльный формат поля References', mtError, [mbOk], 0)('Указанного поля в Foreign не найдено в таблице '+Trim(ComboBox1.Text), mtError, [mbOk], 0)('Не все поля заполнены', mtError, [mbOk], 0);;;if (MyAction=5) then

//изменяем имя таблицы(Trim(ComboBox1.Text),edit2.Text) ;;radiobutton2.Checked=true then:=FPrintStr();(Content,combobox1.Text, StringGrid1);;;

//добавляем полеTForm1.N4Click(Sender: TObject);;:=2;.ComboBox1.Visible:=true;.Label1.Visible:=true;.Label1.Caption:='Таблица';.Label2.Visible:=true;.Label2.Caption:='Имя поля';.Label3.Visible:=true;.Label3.Caption:='Тип';.Label4.Visible:=true;.Label4.Caption:='Длина';.Edit2.Visible:=true;.Edit3.Visible:=true;.Button1.Visible:=true;.Button1.Caption:='Добавить';.ComboBox2.Visible:=true;.CheckBox1.Visible:=true;.Items.Clear;.Items.Add('int');.Items.Add('char');.Items.Add('varchar');.Items.Add('double');.Text:='Выбрать';;TForm1.CheckBox1Click(Sender: TObject);.Edit5.Visible:=true;;TForm1.ComboBox1Change(Sender: TObject);.Text:='Выбрать';;TForm1.ComboBox2Change(Sender: TObject);.Text:='Выбрать';;TForm1.ComboBox1Select(Sender: TObject);, j, k, n, m: integer;(MyAction=2) then

//Читаем список полей:=FSpisokField;

// ComboBox2.Items.Clear;:=1;:=0;:='';:='';i<=Length(SpisokField) do(SpisokField[i]<>'&') then Content:=Content+SpisokField[i]:=0;k<=Length(Content) doContent[k]='|' then inc(j);(Content[k]='|') and (j=2) then:=Copy(Content,1,k);:=1;:='';j<=Length(Temp) doTemp[j]<>'|' then Temp1:=Temp1+Temp[j]if Temp1=ComboBox1.Text then:=Temp1+'|';:=Copy(Temp,j+1,Length(Temp)-j-1);.Items.Add(Temp);:='';:='';:=Length(Temp);;(j);;:='';:='';:=0;:=Length(Content);;(k);;:='';;(i);;;;TForm1.N6Click(Sender: TObject);;:=4;.Caption:='Просмотр данных';.Visible:=true;.RadioButton1.Visible:=true;.RadioButton2.Visible:=true;.RadioButton3.Visible:=true;.RadioButton4.Visible:=true;;TForm1.N7Click(Sender: TObject);.Close;;TForm1.N9Click(Sender: TObject);;:=5;.ComboBox1.Visible:=true;.Label1.Visible:=true;.Label1.Caption:='Таблица';.Label2.Visible:=true;.Label2.Caption:='Новое Имя';.Edit2.Visible:=true;.Button1.Visible:=true;;TForm1.RadioButton1Click(Sender: TObject);i,j:integer;.Memo1.Visible:=false;i:=0 to Form1.StringGrid1.RowCount doj:=0 to Form1.StringGrid1.ColCount do.StringGrid1.Cells[i,j]:='';.Visible:=true;.StringGrid1.ColCount:=2;.StringGrid1.Cells[0,0]:='Таблица';.StringGrid1.Cells[1,0]:='Кол-во полей';(stringGrid1);;TForm1.RadioButton2Click(Sender: TObject);i,j:integer;.Memo1.Visible:=false;.Visible:=true;.Visible:=true;.Button1.Visible:=true;.Button1.Caption:='Показать';i:=0 to Form1.StringGrid1.RowCount doj:=0 to Form1.StringGrid1.ColCount do.StringGrid1.Cells[i,j]:='';.Visible:=true;.StringGrid1.ColCount:=5;.StringGrid1.Cells[0,0]:='Таблица';.StringGrid1.Cells[1,0]:='Поле';.StringGrid1.Cells[2,0]:='Тип';.StringGrid1.Cells[3,0]:='Primary';.StringGrid1.Cells[4,0]:='Foreign';;TForm1.RadioButton3Click(Sender: TObject);.Memo1.Visible:=true;(Memo1);;

TForm1.RadioButton4Click(Sender: TObject);i,j:integer;.Memo1.Visible:=false;.Visible:=true;.StringGrid1.ColCount:=3;i:=0 to Form1.StringGrid1.RowCount doj:=0 to Form1.StringGrid1.ColCount do.StringGrid1.Cells[i,j]:='';.StringGrid1.Cells[0,0]:='Индекс';.StringGrid1.Cells[1,0]:='Таблица';.StringGrid1.Cells[2,0]:='Поле';(StringGrid1);;

TForm1.N5Click(Sender: TObject);;:=3;.ComboBox1.Visible:=true;.Label1.Visible:=true;.Label1.Caption:='Таблица';.Label3.Visible:=true;.Label3.Caption:='Тип';.Button1.Visible:=true;.Button1.Caption:='Добавить';.ComboBox2.Visible:=true;.Items.Clear;.Items.Add('Foreign');.Items.Add('Primary');

ComboBox2.Text:='Выбрать';;

//выбираем имя таблицы для заполнения поля

procedure TForm1.ComboBox1DropDown(Sender: TObject);, j, k, n, m: integer;(MyAction=2)or (MyAction=3) or (MyAction=4) then:=FSpisokTables;.Items.Clear;:=1;:='';i<=Length(SpisokTables) doSpisokTables[i]<>'&' then Temp:=Temp+SpisokTables[i].Items.Add(Temp);:='';;{else}(i);; {while}; {if}; {pocedure}TForm1.ComboBox2Select(Sender: TObject);(MyAction=3) then(ComboBox2.Text='Primary') then.Visible:=true;.Caption:='Primary';.Visible:=true;.Visible:=false;.Visible:=false;{if}if (ComboBox2.Text='Foreign').Visible:=true;.Caption:='Foreign';.Visible:=true;.Visible:=true;.Caption:='References';

// label4.Caption:='Foreign';.Visible:=true;;{then};{if};

.

MyFunction;Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, Grids;AddTable(NameTable: string);AddField(NameTable: string; NameField: string; NameType: string; LengthType: string);AddKey(NameTable: string; Primary: string; Foreign: string; References: string; Why: string);AddIndex(NameInd,NameTable,NameField:string);InTable(NameTable: string):boolean;InField(NameTable: string; NameField: string):boolean;InKey(NameTable: string; Why: string):boolean;FPrintStr():string;PrintData(PrintStr,name:string; StringGrid1:TStringGrid);printTables(StringGrid1:TStringGrid);PrintRelations(Memo1:Tmemo);PrintIndex(StringGrid1:TStringGrid);FSpisokTables:string;FSpisokField:string;FSpisokKeys:string;AlterTable(OldName: string; NewName: string):boolean;: string='syscatalog\tables.txt';: string='syscatalog\field.txt';: string='syscatalog\keys.txt';: string='syscatalog\index.txt';: TextFile; //Файл таблиц: TextFile; //Файл полей: TextFile; //Файл ключей:TextFile;,SpisokField,SpisokKeys,Content,Temp,Temp1,Temp2, Temp3, Temp4:string;, Primary, Foreign, Column, ColumnType,SpisokPrint: string;:boolean;: integer;AddTable(NameTable: string);(Tables,PathToTables);(Tables);(Tables,NameTable);(Tables);;AddField(NameTable: string; NameField: string; NameType: string; LengthType: string);(field, PathToField);(field);:=Trim(NameTable)+'|'+Trim(NameField)+'|'+Trim(NameType)

+'|'+Trim(LengthType);(field, Temp);(field);;

AddKey(NameTable: string; Primary: string; Foreign: string; References: string; Why: string);: integer;:=false;(Keys, PathToKeys);(Keys);:='';not eof(Keys) do(Keys, Content);:=1;:='';i<=Length(Content) do(Content[i]<>'|') then Temp:=Temp+Content[i];(Content[i]='|') thenNameTable<>Temp then SpisokKeys:=SpisokKeys+Content+'&'if (Why='Primary') and (NameTable=Temp) then begin SpisokKeys:=SpisokKeys+NameTable+'|'+Primary+'|'+Copy(Content,i+1,Length(Content)-i)+'&'; Logic:=true; endif (Why='Foreign') and (NameTable=Temp) then begin SpisokKeys:=SpisokKeys+Content+'|'+Foreign+'|'+References+'&'; Logic:=true; end;:='';:=Length(Content);;(i);;;not Logic thenWhy='Primary' then :=SpisokKeys+NameTable+'|'+Primary+'&'if Why='Foreign' then :=SpisokKeys+NameTable+'|'+Foreign+'|'+References+'&';;(Keys);:=1;:='';i<=Length(SpisokKeys) doSpisokKeys[i]<>'&' then Temp:=Temp+SpisokKeys[i](Keys, Temp);:='';;(i);;(Keys);;AddIndex(NameInd,NameTable,NameField:string);:='';(Index, PathToInd);(index);:=NameInd+'|'+NameTable+'|'+NameField ;(Index, Temp);(Index);;

//Существование таблицыInTable(NameTable: string):boolean;:=false;(Tables, PathToTables);(Tables);:='';not eof(Tables) do(Tables, Temp);(NameTable=Temp) then Logic:=true;(Tables);:=Logic;;

//Существование поля в таблицеInField(NameTable: string; NameField: string):boolean;, j, k, n, m: integer;(Field, PathToField);:=0;:=0;:=1;:='';n<=Length(NameField) doNameField[n]<>',' then Temp:=Temp+NameField[n];(NameField[n]=',') or (n=Length(NameField)) then(m);:=NameTable+'|'+Trim(Temp);(Field);not eof(Field) do(Field, Content);:=1;:=0;:='';i<=Length(Content) do(Content[i]<>'|') and (j<>2) then Temp1:=Temp1+Content[i]if Content[i]='|' then begin Temp1:=Temp1+Content[i]; inc(j); end;(Content[i]='|') and (j=2) thenTemp1[Length(Temp1)]='|' then Temp1:=Copy(Temp1,1,Length(Temp1)-

);Temp=Temp1 then inc(k);:='';:=Length(Content);;(i);;;:='';(Field);;(n);;m=k then Logic:=trueLogic:=false;:=Logic;;

//Существование ключа в таблицеInKey(NameTable: string; Why: string):boolean;, j, n:integer;:=false;(Keys, PathToKeys);(Keys);:='';(not eof(Keys)) and (not Logic) do(Keys, Content);:=1;:=0;:='';i<=Length(Content) doContent[i]<>'|' then Temp:=Temp+Content[i]if Content[i]='|' then(Temp=NameTable) and (not Logic) then Logic:=true;Logic then inc(j);;(i);;;(Logic) thenWhy='Primary' then:=j mod 2;n=1 then Logic:=trueLogic:=false;if Why='Foreign' thenj>1 then Logic:=trueLogic:=false;;(Keys);:=Logic;;

//Список таблицFSpisokTables:string;(Tables, PathToTables);(Tables);:='';not eof(Tables) do(Tables, Temp);:=SpisokTables+Temp+'&';;(Tables);:=SpisokTables;;

//Список полейFSpisokField:string;(Field, PathToField);(Field);:='';not eof(Field) do(Field, Temp);:=SpisokField+Temp+'&';;(Field);:=SpisokField;;

//Список ключейFSpisokKeys:string;(Keys, PathToKeys);(Keys);:='';not eof(Keys) do(Keys, Temp);:=SpisokKeys+Temp+'&';;(Keys);:=SpisokKeys;;FPrintStr():string;, j, k:integer;:=FSpisokTables;:=1;:='';:='';i<=Length(SpisokTables) doSpisokTables[i]<>'&' then Content:=Content+SpisokTables[i]:=SpisokPrint+Content;:=false;:=FSpisokKeys;:=1;:='';j<=Length(SpisokKeys) do(SpisokKeys[j]<>'&') then Temp:=Temp+SpisokKeys[j]:=0;k<=Length(Temp) doTemp[k]='|' thenContent=Copy(Temp,1,k-1) then:=true;:=SpisokPrint+'|'+Copy(Temp,k+1,Length(Temp)-k)+'|';:=Length(Temp);;(k);;:='';;(j);;not Logic then:=SpisokPrint+'|||';:=SpisokPrint+'$';:=false;:=FSpisokField;:=1;:='';j<=Length(SpisokField) do(SpisokField[j]<>'&') then Temp:=Temp+SpisokField[j]:=0;k<=Length(Temp) doTemp[k]='|' thenContent=Copy(Temp,1,k-1) then:=true;:=SpisokPrint+Copy(Temp,k+1,Length(Temp)-k)+'|$';;:=Length(Temp);;(k);;:='';;(j);;not Logic then:=SpisokPrint+'|||';:=SpisokPrint+'&';:='';;(i);;:=SpisokPrint;;

//Выводим данные каталога в StringGrid

procedure PrintData(PrintStr,name:string; StringGrid1:TStringGrid);, j, k, n:integer;

//Смотрим:=1;:=PrintStr;:=1;:='';i<=Length(SpisokPrint) doSpisokPrint[i]<>'&' then Content:=Content+SpisokPrint[i]:='';:='';:='';:=1;j<=Length(Content) do if Content[j]<>'$' then inc(j) else break;:=Copy(Content,1,j-1);:=Copy(Content,j+1,Length(Content));:=1;j<=Length(Temp3) do if Temp3[j]<>'|' then inc(j) else break;:=Copy(Temp3,1,j-1);NameTable=Name then:=Copy(Temp3,j+1,Length(Temp3));InKey(Trim(NameTable), 'Primary') then:=1;j<=Length(Temp3) do if Temp3[j]<>'|' then inc(j) else break;:='primary key ('+Copy(Temp3,1,j-1)+')';:=Copy(Temp3,j+1,Length(Temp3));;:=0;:=1;:='';:='';(k<=Length(Temp3)) do(Temp3[k]<>'|') and (j mod 2 = 0) then Temp1:=Temp1+Temp3[k];(Temp3[k]<>'|') and (j mod 2 <> 0) then Temp2:=Temp2+Temp3[k];(Temp3[k]='|') or (k=Length(Temp3)) then begin Logic:=true; inc(j); end;

(Logic) and (j mod 2 = 0) then(Temp1<>'') and (Temp2<>'') then:=Foreign+'foreign key ('+Temp1+') references '+Temp2+' ';:=false;;(Temp3[k]='|') and (j mod 2 = 0) then begin Temp1:=''; Temp2:=''; end;(k);;:=Temp4;.Cells[0,row]:=NameTable;.Cells[3,row]:=Primary;.Cells[4,row]:=Foreign;.RowCount:=row+1;

//Собираем поля:=false;:='';:=1;n<=Length(Content) doContent[n]<>'$' then Temp:=Temp+Content[n]:=true;:=0;:=1;:='';:='';k<=Length(Temp) doTemp[k]='|' then(j);j=1 then Column:=Copy(Temp,1,k-1);(j=2) and (Copy(Temp,1,k-1)<>'') then ColumnType:=Copy(Temp,1,k-1);(j=3) and (Copy(Temp,1,k-1)<>'') then ColumnType:=ColumnType+' ('+Copy(Temp,1,k-1)+')';:=Copy(Temp,k+1,Length(Temp)-k);:=0;;j=3 then k:=Length(Temp);(k);;:='';.Cells[1,row]:=Column;.Cells[2,row]:=ColumnType;.RowCount:=row+1;(row);;

(n);;;not Logic then inc(row);

:='';;(i);;;printTables(StringGrid1:TStringGrid);i,j,n,count,rows:integer;:string;:=1; j:=1; n:=1; count:=0; rows:=0;:=FSpisokTables;i<=length(SpisokTables) doSpisokTables[i]<>'&' do i:=i+1;.Cells[0,j]:=copy(SpisokTables,n,i-n);:=rows+1;:=i+1;:=i;:=j+1;;:=1;:=1;i:=1 to rows do(Field, PathToField);(Field);not eof (Field) do:=1;(field,Content);(content[j]<>'|') and (i<=length(content)) do j:=j+1;StringGrid1.Cells[0,i]=copy(content,1,j-1) then:=count+1;;;.cells[1,i]:=inttostr(count);:=0;(Field);;;

PrintRelations(Memo1:Tmemo);i,n:integer;,NameTable2,primary1,primary2,s:string;:boolean;(Keys, PathToKeys);(Keys);not eof (keys) do:=false;(keys,content);i:=1 to length(content) docontent[i]='.' then f:=true;f=true then:=1;n:=i;:=''; NameTable2:='';primary1:='';primary2:='';:='';(content[i]<>'|') and (i<=length(content)) do i:=i+1;:=copy(content,n,i-n);:=i+1; n:=i;(content[i]<>'|') and (i<=length(content)) do i:=i+1;:=copy(content,n,i-n);:=i+1; n:=i;(content[i]<>'|') and (i<=length(content)) do i:=i+1;:=copy(content,n,i-n);:=i+1; n:=i;(content[i]<>'.') and (i<=length(content)) do i:=i+1;:=copy(content,n,i-n);:=i+1; n:=i;i<=length(content) do i:=i+1;:=copy(content,n,i-n);:=i+1; n:=i;:='Таблица '+NameTable1+' ('+primary1+' - primary key'+')'

+' связана внешним ключом '+ foreign+ ' с таблицей '+NameTable2+' ('

+ primary2+' - primary key)';.Lines.Add(s);.Lines.Add('');:='';;;(keys);;PrintIndex(StringGrid1:TStringGrid);i,n,rows:integer;:string;(Index, PathToInd);(Index);:=1;not eof(index) do:=1; n:=i;(Index,Content);content[i]<>'|' do i:=i+1;.Cells[0,rows]:= copy(content,n,i-n);:=i+1; n:=i;content[i]<>'|' do i:=i+1;.Cells[1,rows]:= copy(content,n,i-n);:=i+1; n:=i;i<=length(content) do i:=i+1;.Cells[2,rows]:= copy(content,n,i-n);:=i+1; n:=i;:=rows+1;;;

//Изменение таблицыAlterTable(OldName: string; NewName: string):boolean;:integer;:=false;(Tables, PathToTables);(Tables);:='';not eof(Tables) do(Tables, Temp);(OldName<>Temp) then Content:=Content+Temp+'|'begin Content:=Content+NewName+'|'; Logic:=true; end;;(Tables);(Tables);:=1;:='';i<=Length(Content) doContent[i]<>'|' then Temp:=Temp+Content[i](Tables, Temp);:='';;(i);;

CloseFile(Tables);

//Изменяем в списке полей

AssignFile(Field, PathToField);(Field);:='';not eof(Field) do(Field, Content);:=1;:='';i<=Length(Content) doContent[i]<>'|' then Temp:=Temp+Content[i]OldName<>Temp then SpisokField:=SpisokField+Content+'&'SpisokField:=SpisokField+NewName+Copy(Content, i, Length(Content)-i+1)+'&';:='';:=Length(Content);;(i);;;(Field);(Field);:=1;:='';i<=Length(SpisokField) doSpisokField[i]<>'&' then Temp:=Temp+SpisokField[i](Field, Temp);:='';;(i);;

CloseFile(Field);

//Изменяем в списке ключей

AssignFile(Keys, PathToKeys);(Keys);:='';not eof(Keys) do(Keys, Content);:=1;:='';i<=Length(Content) do

Content[i]<>'|' then Temp:=Temp+Content[i]OldName<>Temp then SpisokKeys:=SpisokKeys+Content+'&'SpisokKeys:=SpisokKeys+NewName+Copy(Content, i, Length(Content)-i+1)+'&';:='';:=Length(Content);;(i);;;(Keys);(Keys);:=1;:='';i<=Length(SpisokKeys) doSpisokKeys[i]<>'&' then Temp:=Temp+SpisokKeys[i](Keys, Temp);:='';;(i);;(Keys);

:=Logic;;

end.



Курсовая работа по дисциплине Базы данных тема: Реализация системного каталога. Основные хранимые характери

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ