Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

А.С.Грошев.Базы данных.Уч.пособие

.pdf
Скачиваний:
150
Добавлен:
12.04.2015
Размер:
3.1 Mб
Скачать

select count( * ) into numrows from "Spect"

where :new_ins."n_spect" = "Spect"."n_spect";

IF ( numrows = 0 ) then begin

RAISE_APPLICATION_ERROR(-20004,'Parent does not exist. Cannot insert child.'); end;

end if; end; end if;

-- restrict child Spisok when parent Fclt insert if (:new_ins."n_fclt" is not null) then

begin select count( * ) into numrows from "Fclt"

where :new_ins."n_fclt" = "Fclt"."n_fclt";

IF ( numrows = 0 ) then begin

RAISE_APPLICATION_ERROR(-20004,'Parent does not exist. Cannot insert child.'); end;

end if; end; end if; end;

/

-- Insert trigger for Ocenki

Create Trigger "ti_Ocenki" after insert on "Ocenki"

referencing new as new_ins for each row declare numrows integer;

begin

-- restrict child Ocenki when parent Predmets insert if (:new_ins."n_predm" is not null) then

begin select count( * ) into numrows from "Predmets"

where :new_ins."n_predm" = "Predmets"."n_predm";

IF ( numrows = 0 ) then begin

RAISE_APPLICATION_ERROR(-20004,'Parent does not exist. Cannot insert child.'); end;

end if; end; end if;

-- restrict child Ocenki when parent Spisok insert if (:new_ins."NZ" is not null) then

begin select count( * ) into numrows from "Spisok"

where :new_ins."NZ" = "Spisok"."NZ";

IF ( numrows = 0 ) then begin

RAISE_APPLICATION_ERROR(-20004,'Parent does not exist. Cannot insert child.'); end;

end if; end; end if; end;

/

Create role "Programmer"

/

31

Create role "operator"

/

Create role "Dekan"

/

/* Roles permissions */

Grant select on "Spisok" to "Programmer"

/

Grant update on "Spisok" to "Programmer"

/

Grant delete on "Spisok" to "Programmer"

/

Grant insert on "Spisok" to "Programmer"

/

Grant references on "Spisok" to "Programmer"

/

Grant select on "Spisok" to "Dekan"

/

Grant update on "Spisok" to "Dekan"

/

Grant delete on "Spisok" to "Dekan"

/

Grant insert on "Spisok" to "Dekan"

/

Grant references on "Spisok" to "Dekan"

/

Grant select on "Ocenki" to "Programmer"

/

Grant update on "Ocenki" to "Programmer"

/

Grant delete on "Ocenki" to "Programmer"

/

Grant insert on "Ocenki" to "Programmer"

/

Grant references on "Ocenki" to "Programmer"

/

Grant select on "Ocenki" to "operator"

/

Grant update on "Ocenki" to "operator"

/

Grant delete on "Ocenki" to "operator"

/

Grant insert on "Ocenki" to "operator"

/

Grant references on "Ocenki" to "operator"

/

Grant select on "Fclt" to "Programmer"

/

Grant update on "Fclt" to "Programmer"

/

Grant delete on "Fclt" to "Programmer"

/

Grant insert on "Fclt" to "Programmer"

/

Grant references on "Fclt" to "Programmer"

/

Grant select on "Spect" to "Programmer"

/

Grant update on "Spect" to "Programmer"

/

Grant delete on "Spect" to "Programmer"

/

Grant insert on "Spect" to "Programmer"

/

Grant references on "Spect" to "Programmer"

/

Grant select on "Spect" to "Dekan"

/

Grant update on "Spect" to "Dekan"

/

32

Grant delete on "Spect" to "Dekan"

/

Grant insert on "Spect" to "Dekan"

/

Grant references on "Spect" to "Dekan"

/

Grant select on "Predmets" to "Programmer"

/

Grant update on "Predmets" to "Programmer"

/

Grant delete on "Predmets" to "Programmer"

/

Grant insert on "Predmets" to "Programmer"

/

Grant references on "Predmets" to "Programmer"

/

Grant select on "Predmets" to "Dekan"

/

Grant update on "Predmets" to "Dekan"

/

Grant delete on "Predmets" to "Dekan"

/

Grant insert on "Predmets" to "Dekan"

/

Grant references on "Predmets" to "Dekan"

/

/* Users permissions */

Grant select on "Fclt" to "Pavlov"

/

Grant update on "Fclt" to "Pavlov"

/

Grant delete on "Fclt" to "Pavlov"

/

Grant insert on "Fclt" to "Pavlov"

/

Grant references on "Fclt" to "Pavlov"

/

Grant select on "Spect" to "Pavlov"

/

Grant update on "Spect" to "Pavlov"

/

Grant delete on "Spect" to "Pavlov"

/

Grant insert on "Spect" to "Pavlov"

/

Grant references on "Spect" to "Pavlov"

/

Grant select on "Predmets" to "Pavlov"

/

Grant update on "Predmets" to "Pavlov"

/

Grant delete on "Predmets" to "Pavlov"

/

Grant insert on "Predmets" to "Pavlov"

/

Grant references on "Predmets" to "Pavlov"

/

33

Приложение 1.2 Сгенерированная Case Studio программа создания таблиц базы данных для СУБД Access

' Created

05.04.2005

' Modified

22.03.2005

' Project

Kontingent

' Model

Students

' Company

AGTU

' Author

Groshev

' Version

2005.1

' Database

Access 2000

'======================================================= '=== MS Access 2000 database creation method

'===

'=== 1. Create a new database in the MS Access 2000 '=== 2. Create a new module

'=== 3. Copy the CASE Studio 2 output SQL script into the new MS Access 2000 module

'=== 4. Select from main menu "Tools" item "References..." and check the "Microsoft DAO 3.6 Object

Library."

'=== 5. Place your mouse cursor somewhere in the main procedure Main()

'=== 6. Run the module code (Click the "Run Sub/UserForm" button or press F5) '=======================================================

Public dbs As DAO.Database

Public tdf As DAO.TableDef

Public idx As DAO.Index

Public rel As DAO.Relation

Sub Main()

Set dbs = CurrentDb()

On Error GoTo ErrorHandler Call CreateTables

Call CreatePrimaryKeys Call CreateIndexes Call CreateAlterKeys Call CreateRelations Call CreateQueries

MsgBox "Script successfully processed.", vbInformation Exit Sub

ErrorHandler:

Select Case Err.Number Case 3010

MsgBox "Table " & tdf.Name & " allready exist!", vbInformation Err.Clear

Case 3284

MsgBox "Index " & idx.Name & " for table " & tdf.Name & " allready exist!", vbInformation Err.Clear

Case Else

MsgBox Err.Description, vbCritical

End Select

End Sub

' Create tables '=============== Sub CreateTables()

Call CreateTable1 'Spisok Call CreateTable2 'Ocenki Call CreateTable3 'Fclt Call CreateTable4 'Spect

34

Call CreateTable5 'Predmets

End Sub

'=== Create table Spisok ======

Sub CreateTable1()

Set tdf = dbs.CreateTableDef( "Spisok" )

Call AddFieldToTable("NZ", dbText, 7, 0, "", "", "", TRUE ) Call AddFieldToTable("FIO", dbText, 45, 0, "", "", "", TRUE )

Call AddFieldToTable("data_p", dbDate, 0, 0, "", "", "", FALSE ) Call AddFieldToTable("n_fclt", dbLong, 0, 0, "", "", "", TRUE ) Call AddFieldToTable("n_spect", dbLong, 0, 0, "", "", "", TRUE ) Call AddFieldToTable("kurs", dbLong, 0, 0, "", "", "", TRUE ) Call AddFieldToTable("n_grup", dbText, 3, 0, "", "", "", TRUE ) Call AddFieldToTable("n_pasp", dbText, 10, 0, "", "", "", FALSE ) dbs.TableDefs.Append tdf

End Sub

'=== Create table Ocenki ======

Sub CreateTable2()

Set tdf = dbs.CreateTableDef( "Ocenki" )

Call AddFieldToTable("NZ", dbText, 7, 0, "", "", "", TRUE )

Call AddFieldToTable("semestr", dbLong, 0, 0, "", "", "", FALSE ) Call AddFieldToTable("n_predm", dbLong, 0, 0, "", "", "", TRUE ) Call AddFieldToTable("ball", dbText, 1, 0, "", "", "", FALSE )

Call AddFieldToTable("data_b", dbDate, 0, 0, "", "", "", FALSE ) Call AddFieldToTable("prepod", dbLong, 0, 0, "", "", "", FALSE ) dbs.TableDefs.Append tdf

End Sub

'=== Create table Fclt ======

Sub CreateTable3()

Set tdf = dbs.CreateTableDef( "Fclt" )

Call AddFieldToTable("n_fclt", dbLong, 0, 0, "", "", "", TRUE ) Call AddFieldToTable("name_f", dbText, 120, 0, "", "", "", FALSE ) dbs.TableDefs.Append tdf

End Sub

'=== Create table Spect ======

Sub CreateTable4()

Set tdf = dbs.CreateTableDef( "Spect" )

Call AddFieldToTable("n_spect", dbLong, 0, 0, "", "", "", TRUE ) Call AddFieldToTable("name_s", dbText, 120, 0, "", "", "", FALSE ) dbs.TableDefs.Append tdf

End Sub

'=== Create table Predmets ======

Sub CreateTable5()

Set tdf = dbs.CreateTableDef( "Predmets" )

Call AddFieldToTable("n_predm", dbLong, 0, 0, "", "", "", TRUE ) Call AddFieldToTable("name_p", dbText, 120, 0, "", "", "", FALSE ) dbs.TableDefs.Append tdf

End Sub

' Create primary keys '===================== Sub CreatePrimaryKeys()

'=== Create primary key for table Spisok ======

Set tdf = dbs.TableDefs( "Spisok" )

Set idx = tdf.CreateIndex( "pk_Spisok" ) idx.Primary = True

idx.Unique = True

35

idx.IgnoreNulls = False

Call AddFieldToIndex( "NZ", False ) tdf.Indexes.Append idx

'=== Create primary key for table Fclt ======

Set tdf = dbs.TableDefs( "Fclt" )

Set idx = tdf.CreateIndex( "pk_Fclt" ) idx.Primary = True

idx.Unique = True idx.IgnoreNulls = False

Call AddFieldToIndex( "n_fclt", False ) tdf.Indexes.Append idx

'=== Create primary key for table Spect ======

Set tdf = dbs.TableDefs( "Spect" )

Set idx = tdf.CreateIndex( "pk_Spect" ) idx.Primary = True

idx.Unique = True idx.IgnoreNulls = False

Call AddFieldToIndex( "n_spect", False ) tdf.Indexes.Append idx

'=== Create primary key for table Predmets ======

Set tdf = dbs.TableDefs( "Predmets" )

Set idx = tdf.CreateIndex( "pk_Predmets" ) idx.Primary = True

idx.Unique = True idx.IgnoreNulls = False

Call AddFieldToIndex( "n_predm", False ) tdf.Indexes.Append idx

End Sub

'Create indexes '================ Sub CreateIndexes() End Sub

'Create alter keys (unique indexes in MS ACCESS) '================================================ Sub CreateAlterKeys()

End Sub

'Create relations

'================== Sub CreateRelations()

'=== Create relations between parent table Spisok and child table Ocenki ======

Set rel = dbs.CreateRelation("Spisok_Ocenki")

rel.Table

= "Spisok"

rel.ForeignTable = "Ocenki"

rel.Attributes

= dbRelationUpdateCascade+dbRelationDeleteCascade

Call AddFieldToRelation("NZ", "NZ") dbs.Relations.Append rel

'=== Create relations between parent table Fclt and child table Spisok ======

Set rel = dbs.CreateRelation("Fclt_Spisok")

rel.Table

= "Fclt"

rel.ForeignTable = "Spisok"

rel.Attributes

= dbRelationUpdateCascade+dbRelationDeleteCascade

Call AddFieldToRelation("n_fclt", "n_fclt") dbs.Relations.Append rel

36

'=== Create relations between parent table Spect and child table Spisok ======

Set rel = dbs.CreateRelation("Spect_Spisok")

rel.Table

= "Spect"

rel.ForeignTable = "Spisok"

rel.Attributes

= dbRelationUpdateCascade+dbRelationDeleteCascade

Call AddFieldToRelation("n_spect", "n_spect") dbs.Relations.Append rel

'=== Create relations between parent table Predmets and child table Ocenki ======

Set rel = dbs.CreateRelation("Predmets_Ocenki")

rel.Table

= "Predmets"

rel.ForeignTable = "Ocenki"

rel.Attributes

= dbRelationUpdateCascade+dbRelationDeleteCascade

Call AddFieldToRelation("n_predm", "n_predm") dbs.Relations.Append rel

End Sub

'Create queries '================ Sub CreateQueries() Dim qdf As QueryDef End Sub

'Add fields to table '=====================

Sub AddFieldToTable(FieldName As String, DataType As String, SizeCol As Integer, Attributes As

Long, DefaultValue As Variant, ValText As String, ValRule As String, NotN As Boolean)

Dim fld As DAO.Field

 

 

Set fld = tdf.CreateField( FieldName, DataType )

 

If SizeCol

 

<> 0 Then fld.Size

= SizeCol

If Attributes

<> 0 Then fld.Attributes = Attributes

 

fld.Required

 

= NotN

 

fld.DefaultValue = DefaultValue

 

fld.ValidationRule

= ValRule

 

fld.ValidationText

= ValText

 

tdf.Fields.Append fld

 

 

End Sub

 

 

 

'Add properties to table '=========================

Sub AddPropertyToTable( PropertyName As String, Value As Variant, DataType As String) Dim prp As DAO.Property

Set prp = tdf.CreateProperty(PropertyName, DataType, Value) tdf.Properties.Append prp

End Sub

'Add properties to field

'=========================

Sub AddPropertyToField( FieldName As String, PropertyName As String, Value As Variant, DataType As String)

Dim prp As DAO.Property Dim fld As DAO.Field

Set fld = tdf.Fields( FieldName )

Set prp = fld.CreateProperty(PropertyName, DataType, Value) fld.Properties.Append prp

End Sub

' Add fields to index '=====================

Sub AddFieldToIndex( FieldName As String, Descending As Boolean ) Dim fld As DAO.Field

Set fld = idx.CreateField( FieldName )

37

If Descending = True Then fld.Attributes = dbDescending idx.Fields.Append fld

End Sub

' Add fields to relation '========================

Sub AddFieldToRelation( PKField As String, FKField As String ) Dim fld As DAO.Field

Set fld = rel.CreateField( PKField ) fld.ForeignName = FKField rel.Fields.Append fld

End

Sub

38

Глава 2. Основы работы с базами данных в системе

Visual FoxPro

2.1. Общая характеристика системы

Visual FoxPro (VFP) – современная СУБД для персональных компьютеров, использующая реляционные базы данных, имеющая объектноориентированный алгоритмический язык для работы с информацией, методы визуального программирования и достаточно большие возможности (табл. 2.1). Версия системы 7.0 может работать в операционных системах Windows 9x и ядра NT, версии 8.0 и 9.0 – только в Windows 2000, 2003 и XP.

Таблица 2.1. Основные максимальные возможности системы Visual FoxPro

 

Наименование предельной величины

 

 

Предельная

 

 

 

 

величина

 

 

 

 

 

 

 

Количество записей в файле таблицы

 

 

1 миллиард

 

 

Размер файла таблицы

 

 

2 гигабайта

 

 

Количество символов в одной записи

 

 

65500

 

 

Количество полей в одной записи

 

 

255

 

 

Количество одновременно открытых таблиц

 

 

255

 

 

Количество символов в поле таблицы

 

 

254

 

 

Количество байтов в индексном ключе в некомпаунд-

 

 

100

 

 

ном индексе

 

 

 

 

 

Количество байтов в индексном ключе в компаундном

 

 

240

 

 

индексе

 

 

 

 

 

Количество открытых индексных файлов для одной

 

 

не ограничено

 

 

таблицы

 

 

 

 

 

Количество открытых индексов во всех рабочих облас-

 

 

не ограничено

 

 

тях

 

 

 

 

 

Количество связей

 

 

не ограничено

 

 

Длина выражений связи

 

 

не ограничена

 

 

Размер символьных полей

 

 

254

 

 

Размер числовых полей

 

 

20

 

 

Количество символов в имени поля в свободной табли-

 

 

10

 

 

це

 

 

 

 

 

Количество символов в имени поля в таблице, содер-

 

 

128

 

 

жащейся в базе данных

 

 

 

 

 

Минимальное значение целого числа

 

 

-2 147 483 647

 

 

Максимальное значение целого числа

 

 

2 147 483 647

 

 

Обработка чисел в точных вычислениях

 

 

до

 

 

 

 

 

9007199254740992

 

 

 

 

 

(253)

 

 

Действительные числа

 

 

до 10308 или 2 1023

 

39

 

 

 

 

 

Продолжение табл. 2.1

 

 

 

 

 

 

 

 

Наименование предельной величины

 

 

Предельная

 

 

 

 

величина

 

 

 

 

 

 

 

Количество переменных по умолчанию

 

 

1024

 

 

Количество переменных

 

 

65 000

 

 

Количество массивов

 

 

65 000

 

 

Количество элементов в массиве

 

 

65 000

 

 

Количество строк в исходных программных файлах

 

 

не ограничено

 

 

Размер модуля компилируемой программы

 

 

64 килобайта

 

 

Размер процедур в файле

 

 

неограничен

 

 

Количество вложенных DO

 

 

128

 

 

Количество вложенных READ

 

 

5

 

 

Количество передаваемых параметров

 

 

27

 

 

Количество транзакций

 

 

5

 

 

Количество объектов в отчете

 

 

не ограничено

 

 

Длина описания отчета

 

 

20 дюймов

 

 

Количество уровней группировки

 

 

128

 

 

Длина символьных переменных в отчете

 

 

255

 

 

Количество открытых окон (всех типов)

 

 

не ограничено

 

 

Количество открытых окон BROWSE

 

 

255

 

 

Количество символов в символьной строке или пере-

 

 

16 777 184

 

 

менной памяти

 

 

 

 

 

Количество символов в командной строке

 

 

8192

 

 

Количество открытых файлов

 

 

возможности ОС

 

 

Количество нажатий клавиш в макро

 

 

1024

 

 

Количество полей в одном запросе SQL

 

 

255

 

Некоторые достоинства системы:

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

Windows.

2.Современная организация реляционных баз данных, позволяющая хранить информацию о таблицах базы, их свойствах, индексах и связях, локальных и удаленных представлениях (Views), связях с серверами, о хранимых процедурах, исполняемых при наступлении более 50 различных видов со-

бытий (VFP 7.0 – 9.0).

3.Высокая скорость работы с большими базами данных.

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

40