А.С.Грошев.Базы данных.Уч.пособие
.pdfselect 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