ΑΝΑΠΤΥΞΗ ΚΑΙ ΔΙΑΧΕΙΡΙΣΗ ΠΛΗΡΟΦΟΡΙΑΚΟΥ ΣΥΣΤΗΜΑΤΟΣ ΠΡΟΜΗΘΕΙΩΝ

transportdingdongΛογισμικό & κατασκευή λογ/κού

14 Ιουλ 2012 (πριν από 5 χρόνια και 4 μήνες)

681 εμφανίσεις


1
Αλεξάνδρειο Τεχνολογικό Εκπαιδευτικό
Ίδρυμα Θεσσαλονίκης
Τμήμα Πληροφορικής



Πτυχιακή Εργασία

ΑΝΑΠΤΥΞΗ ΚΑΙ ΔΙΑΧΕΙΡΙΣΗ
ΠΛΗΡΟΦΟΡΙΑΚΟΥ ΣΥΣΤΗΜΑΤΟΣ
ΠΡΟΜΗΘΕΙΩΝ

Κωνσταντινίδης Ευθύμιος ΑΜ:1689
Κούργιας Σωκράτης ΑΜ: 1701


Επιβλέπων Καθηγητής : Κατσαβούνης Στέφανος




Οκτώβριος 2007

2

Περιεχόμενα

Κεφάλαιο 1
1. Εισαγωγή………………………………………………………..…...5
2. Σκοπός της Πτυχιακής……………………………………….…..…..6

Κεφάλαιο 2
1. .NET Framework………………………………………………....…..9
Τι είναι το .NET Framework…………………………………..….9
Η C# και τι .NET Framework………………………………….....9
1.2.1 Η πλατφόρμα .NET…………………………………….…...9
1.2.2 Το .NET Framework……………………………………….10
1.2.3 Μεταγλώττιση και το MSLI……………………………….13
1.2.4 Η γλώσσα C#........................................................................14
2. Βάσεις Δεδομένων…………………………………………………..15
2.1 Εισαγωγή στις βάσεις δεδομένων……………………………….15
2.2 Τα προτερήματα του DBMS…………………………….............16
3.

Το μοντέλο οντότητας-συσχέτισης (ER)…………………………….18
3.1 Επισκόπηση του σχεδιασμού βάσης δεδομένων………………..18
3.1.1 Ανάλυση των Απαιτήσεων…………………………............19
3.1.2 Σχεδιασμός της Ιδεατής Βάσης Δεδομένων ………………..19
3.1.3 Σχεδιασμός της Λογικής Βάσης Δεδομένων……………….19
3.1.4 Tελειοποίηση του Σχήματος………………………………..20
3.1.5 Σχεδιασμός του Φυσικού Σχήματος………………………..20
3.1.6 Σχεδιασμός της Πολιτικής της Ασφαλείας…………………21

Κεφάλαιο 3
1. Περιγραφή του Microsoft SQL Server
Management Studio Express…………………………………….….22
2. Απομακρυσμένη σύνδεση και
δημιουργία χρηστών στην βάση…………………………….…….. 23

Κεφάλαιο 4
1. Περιγραφή της βάσης των προμηθειών..……………………….…...33
1.1 Οι πίνακες της βάσης προμηθειών………………….…………...35
1.1.1 Περιοχή (Region)…………………………………………...35
1.1.2 Πόλη (City)…………………………………………………36
1.1.3 Τμήμα (Department)……………………………………….37

3
1.1.4 Υπάλληλος (Employee)……………………………………..38
1.1.5 Δεδομένα υπαλλήλων (Employee_Data)…………………....39
1.1.6 Προϋπολογισμός Υπαλλήλου (Employee Budget)………….40
1.1.7 Ο Ρόλος του Υπαλλήλου (Employee_Type)………………..41
1.1.8 Ο Πίνακας Login…………………………………………….42
1.1.9 Ο Πίνακας με τα Logs του Login……………………………43
1.1.10 Αιτήσεις (Applications)……………………………………44
1.1.11 Εγκρίσεις (Approves)………………………………………47
1.1.12 Παραγγελίες (Orders)………………………………………50
1.1.13 Προμηθευτές (Suppliers)…………………………………..53
1.1.14 Κατηγορία Είδους (katigoria_eidous)……………………...54
1.1.15 Είδος (Eidos)……………………………………………….55
1.1.16 Προϊόντα που προμηθεύει ο προμηθευτής (Supplies)……..56
1.1.17 Καταστάσεις (States)………………………………………58
1.2 Οι όψεις της βάσης (Views)…………………………………….59
1.3 Οι Συναρτήσεις της Βάσης (Functions)…………………………60
1.3.1 Ανανέωση του προϋπολογισμού των υπαλλήλων
και προμηθευτών (update_budgets)………………………...61
1.3.2 Εμφάνιση αιτήσεων (get_application)……………………....62
1.3.3 Αιτήσεις προς παραγγελία (get_application_to_order)……..62
1.3.4 Ποιοι έχουν εγκρίνει την
αίτηση(get_approvalsby_application)………………………63
1.3.5 Εμφάνιση του υπολοίπου (get_remaining_money)…………64
1.3.6 Εμφάνιση αιτήσεων για έγκριση
(get_subordinate_applications)………………………………65
1.3.7 Εμφάνιση προμηθευτή από το είδος
(get_supplier_by_eidos)……………………………………..66
1.3.8 Οι παραγγελίες του προμηθευτή (MyOrders)……………....66
1.3.9 Αναφορες των παραγγελιών του υπαλλήλου
(report_emp_orders)………………………………………...67
1.3.10 Αναφορες παραγγελιών όλων των υπαλλήλων
ενός τμήματος (report_emps_by_dep)……………………68
1.3.11 Μέση τιμή προϊόντων (get_avg_price)……………………69
1.3.12 Σύνολο χρημάτων που ξόδεψε
ο υπάλληλος (get_emp_spent)……………………………..69

Κεφάλαιο 5
1. Εγχειρίδιο Χρήσης………………………………………………….71
1.1 Περιγραφή Εφαρμογής με Διαγράμματα UML………………...71
1.2 Εγκατάσταση του Db1………………………………………….74

4
1.3 Εγχειρίδιο Παραγγελιών Χρήστη……………………………….78

Βιβλιογραφία………………………………………………………………93


































5



Κεφάλαιο 1


ΤΙΤΛΟΣ: ΑΝΑΠΤΥΞΗ ΚΑΙ ΔΙΑΧΕΙΡΙΣΗ ΠΛΗΡΟΦΟΡΙΑΚΟΥ
ΣΥΣΤΗΜΑΤΟΣ ΠΡΟΜΗΘΕΙΩΝ


1. Εισαγωγή



Η πτυχιακή εργασία αφορά την ανάπτυξη ενός πληροφοριακού
συστήματος για την ηλεκτρονική διαχείριση του συστήματος προμηθειών
και προμηθευτών ενός οργανισμού ή μιας βιομηχανικής μονάδας. Σε
οργανισμούς (π.χ. ΤΕΙΘ ή σε μεγάλες μονάδες με πολυάριθμο προσωπικό,
τμήματα και διάφορους προμηθευτές) η ανάγκη για την αυτόματη και
διαβαθμισμένη παρακολούθηση των παραγγελιών από τον απλό υπάλληλο
μέχρι την έγκριση από τον αρμόδιο, την παραλαβή και την πληρωμή του
προμηθευτή, ακολουθεί διάφορα στάδια. Η εμπλοκή ατόμων αλλά και η
οικονομία χρόνου και χρημάτων είναι σημαντική. Σκοπός της πτυχιακής
είναι η δημιουργία μιας εφαρμογής διαχείρισης προμηθειών με χρήση βάσης
δεδομένων, για την αυτοματοποίηση συγκεκριμένων διαδικασιών της, που
θα αυξήσουν τη λειτουργικότητα της.
Στη σημερινή εποχή της παγκοσμιοποίησης και των υπολογιστών η
ανάγκη για την δημιουργία αυτοματοποιημένων συστημάτων σε μεγάλες
επιχειρήσεις τόσο του δημοσίου όσο και του ιδιωτικού τομέα είναι βασική
προϋπόθεση για την καλύτερη λειτουργία και την αύξηση της απόδοσης της
επιχείρησης.
Μεγάλοι οργανισμοί, με αυξημένα οικονομικά μεγέθη και επίπεδο
τεχνογνωσίας, οι οποίοι καλύπτουν ένα ευρύτερο μέρος της γεωγραφικής
έκτασης όλης της Ελλάδας, δεν διαθέτουν ένα ολοκληρωμένο σύστημα

6
παραγγελιών προμηθειών και προμηθευτών ανάλογο με το μέγεθος τους. Οι
παραγγελίες γίνονται ακόμα με γραπτές αιτήσεις, που απαιτούν σημαντική
γραφειοκρατική δουλειά από τους υπαλλήλους που ζητούν να
προμηθευτούν διάφορα είδη για την εργασία τους. Οι παραγγελίες αργούν
να εγκριθούν από τους υπευθύνους διότι οι γραπτές αιτήσεις αργούν να
μεταφερθούν από το ένα τμήμα στο άλλο. Με τους προμηθευτές δεν
υπάρχει κάποια συγκεκριμένη κατάσταση για τα είδη που προμηθεύουν και
σε ποιες τιμές.
Έτσι, η ανάπτυξη ενός τέτοιου πληροφοριακού συστήματος, εκτιμάται
ότι θα βοηθήσει να γίνει αντιληπτή η αναγκαιότητα τέτοιων πληροφοριακών
συστημάτων σε επιχειρήσεις μεγάλου μεγέθους. Κατάλληλα πληροφοριακά
συστήματα περιορίζουν την γραφειοκρατία και το χρόνο αντιμετώπισης των
διαφορών εργασιών και εξάγουν ολοκληρωτικά και συγκεντρωτικά
αποτελέσματα, όπως στατιστικές μελέτες και διαφορές αναφορές, κατά τη
διάρκεια λειτουργίας της εταιρίας.
Από τα παραπάνω μπορούμε να συμπεράνουμε πως η ανάπτυξη ενός
πληροφοριακού συστήματος διαχείρισης προμηθειών σε μια μεγάλη
επιχείρηση με πολλούς υπαλλήλους και εγκαταστάσεις, είναι πολύ
σημαντική τόσο για τη βιωσιμότητα της και την ανταγωνιστικότητα της,
όσο και για την ικανοποίηση των πελατών της.
Σαν πρότυπο για την πτυχιακή αυτή, έχουμε λάβει έναν ελληνικό
δημόσιο οργανισμό. Αυτός ο οργανισμός είναι η ΔΕΗ (Δημόσια Επιχείρηση
Ηλεκτρισμού). Είναι ένας οργανισμός ο οποίος ανταποκρίνεται στα
κριτήρια και τις απαιτήσεις που χαρακτηρίζουν αυτήν την πτυχιακή
εργασία.




2. Σκοπός της Πτυχιακής


Σκοπός αυτής της πτυχιακής εργασίας είναι η ανάπτυξη ενός
πληροφοριακού συστήματος διαχείρισης παραγγελιών, από τη δημιουργία
μέχρι την πλήρη διεκπεραίωση τους. Η δημιουργία ενός τέτοιου
αυτοματοποιημένου συστήματος παραγγελιών, μειώνει την γραφειοκρατία
και το χρόνο πραγματοποίησης μιας παραγγελίας και καθιστά
αποδοτικότερο τον έλεγχο. Η σχεδίαση και η ανάπτυξη προσπάθησε να
εκπληρώσει τα παρακάτω δυο βασικά κριτήρια:

7

• Αυτοματισμός: το σύστημα το οποίο θα αναπτυχθεί θα πρέπει να
περιέχει αυτόματες ενέργειες οι οποίες θα “τρέχουν” στη βάση
δεδομένων. Επιπλέον, κατά τη χρήση του προγράμματος θα
εκτελούνται πάγιες εντολές, ώστε να μειώνεται ο χρόνος
απασχόλησης του προσωπικού κατά την διαδικασία της
παραγγελίας των προϊόντων.
• Διαβαθμισμένη Παρακολούθηση: Εκτός από το γραφειοκρατικό
πρόβλημα που πρέπει να επιλυθεί, θα πρέπει να υπάρχει και ο
απαραίτητος έλεγχος κατά τη ροή των παραγγελιών. Εκτός από τις
εγκρίσεις που θα απαιτούνται για την ολοκλήρωση της
παραγγελίας το σύστημα θα μπορεί άμεσα και οποιαδήποτε στιγμή
να ελέγχει τις παραγγελίες που πραγματοποιηθήκαν.

Στην συνέχεια παρατίθενται ορισμένα χαρακτηριστικά που αφορούν τις
οντότητες και τις λειτουργίες που θα υλοποιεί το πληροφοριακό σύστημα.
Τα χαρακτηριστικά αυτά οριοθετούν και περιγράφουν την φιλοσοφία και τις
δυνατότητες της συγκεκριμένης εφαρμογής.

• Ο πίνακας των ειδών τα οποία θα προμηθεύει η επιχείρηση. Τα
είδη είναι κατηγοριοποιημένα με βάση τα χαρακτηριστικά τους
από τα οποία θα μπορεί να επιλέξει ο κάθε υπάλληλος για την
πραγματοποίηση της παραγγελίας.
• Στους πίνακες που αφορούν τους προμηθευτές, θα
περιλαμβάνονται τα στοιχεία του κάθε προμηθευτή καθώς και τα
είδη τα οποία προμηθεύει και σε ποιες τιμές. Έτσι θα είναι σε θέση
ο υπεύθυνος που θα ολοκληρώνει τις παραγγελίες να αποφασίζει
από ποιον προμηθευτή θα διεκπεραιώνεται η κάθε παραγγελία.
• Στους πίνακες που αφορούν τους εργαζομένους, θα υπάρχουν τα
προσωπικά στοιχεία του κάθε υπαλλήλου, όπως είναι η θέση την
οποία κατέχει μέσα στην εταιρία (rating), ο προϋπολογισμός του
κλπ.
• Στους πίνακες που αφορούν τα αιτήματα, θα εισάγονται τα
χαρακτηριστικά των παραγγελιών, των εργαζομένων που τις
πραγματοποιούν, καθώς και αυτών που τις εγκρίνουν όταν
χρειάζεται. Εκεί θα παραμένουν όλα τα αιτήματα, ακόμα και αυτά
τα οποία απορρίφθηκαν.
• Στον πίνακα παραγγελιών θα εγγράφονται τα αιτήματα τα οποία
εγκρίθηκαν και γίνονται παραγγελίες. Στον πίνακα παραγγελιών

8
θα επιλέγεται ο προμηθευτής στον οποίο θα δίνεται η παραγγελία
για την ολοκλήρωση της.


Αναλυτικότερα, για τον τρόπο αλληλεπίδρασης των πινάκων και τον
τρόπο εκτέλεσης των ενεργειών στην βάση δεδομένων, γίνεται εκτενής
αναφορά στο Κεφαλαίο 4.

Τα εργαλεία που χρησιμοποιήθηκαν για την ολοκλήρωση της εργασίας
αυτά είναι:

• Ο SQL Server Express της Microsoft
• Το Visual Studio 2005 της Microsoft
• SQL Server Studio Management Express
• Visual Paradigm

Τα παραπάνω εργαλεία ήταν αρκετά ευκολόχρηστα , και με αρκετά
πλεονεκτήματα, όπως η εύκολη αλληλεπίδραση μεταξύ τους. Το Visual
Studio 2005 της Microsoft χρησιμοποιεί το .NET Framework 2 το οποίο
περιέχει περισσότερες βιβλιοθήκες από το .NET Framework 1, κάτι που
διευκολύνει πολύ την ανάπτυξη διαφορών προγραμμάτων με το Visual
Studio 2005. Με το SQL Server Studio Management Express,
δημιουργήθηκαν οι πίνακες της εργασίας, τοποθετήθηκαν οι
αλληλεπιδράσεις μεταξύ των πινάκων και δημιουργήθηκαν κάποιοι Triggers
και functions, τα οποία βοηθούν στην καλύτερη λειτουργία και απόδοση της
βάσης. Με το Visual Paradigm έχουν κατασκευαστεί ορισμένα διαγράμματα
uml τα οποία θα περιγράφουν σχηματικά ορισμένες διαδικασίες της
εφαρμογής, για την ευκολότερη κατανόηση της, ως σύστημα προμηθειών
και για το πώς αυτή λειτουργεί.










9


Κεφάλαιο 2



1. .NET Framework


Τι είναι το .NET Framework

Το .NET Framework είναι ένα περιβάλλον ανάπτυξης και εκτέλεσης, το
οποίο επιτρέπει διάφορες γλώσσες προγραμματισμού και βιβλιοθήκες να
δουλεύουν κρυφά μαζί, για να δημιουργήσουν εφαρμογές βασισμένες στο
περιβάλλον των Windows, οι οποίες είναι πιο εύκολο να χτιστούν, να
διαχειριστούν, να αναπτυχθούν και να επικοινωνήσουν μέσω άλλων
συστημάτων στο δίκτυο.


Η C# και το .NET Framework


Ο στόχος της C# είναι να παρέχει μια απλή, ασφαλή, μοντέρνα,
αντικειμενοστραφή, επεκτάσιμη για το διαδίκτυο και υψηλής απόδοσης
γλώσσα για την ανάπτυξη του .NET. Η C# είναι μια νέα γλώσσα
προγραμματισμού, η οποία όμως έχει επηρεαστεί από άλλες γλώσσες όπως
είναι η Java,C++, Visual Basic κ.α.

1) Η πλατφόρμα .NET

Όταν η Microsoft ανακοίνωσε την C# τον Ιούλιο του 2000, η αποκάλυψη
της ήταν μέρος ενός μεγαλύτερου γεγονότος, της ανακοίνωσης της
πλατφόρμας του .NET. Η πλατφόρμα του .NET είναι στην ουσία, ένα νέο
πλαίσιο ανάπτυξης εργασίας, το οποίο παρέχει μια ανανεωμένη εφαρμογή
προγραμματισμού της επιφάνειας αλληλεπίδρασης (API), από τις υπηρεσίες
και τα APIs των κλασικών λειτουργικών συστημάτων των Windows, ενώ

φέρνει παράλληλα στην επιφάνια έναν αριθμό από ανόμοιες τεχνολογίες

10
της Microsoft που αναπτύχθηκαν στα τέλη του 1990. Στην πλατφόρμα
υπάρχουν τέσσερις διαφορετικές ομάδες προϊόντων:

• Ένα σύνολο από γλώσσες προγραμματισμού το οποίο
περιλαμβάνει την C# και Visual Basic .NET, ένα σύνολο
εργαλείων ανάπτυξης, το οποίο περιλαμβάνει το Visual Studio
.NET, ένα σύνολο μεγάλου εύρους από βιβλιοθήκες για την
κατασκευή διαδικτυακών υπηρεσιών και εφαρμογών των
Windows, γνωστότερο και ως Common Language Runtime (CLR),
το οποίο θα εκτελεί αντικείμενα τα οποία έχουν κατασκευαστεί
μέσα σε αυτό το πλαίσιο εργασίας.
• Ένα σύνολο από .NET Enterprise Servers, οι οποίοι είναι γνωστοί,
όπως ο SQL Server, οι οποίοι παρουσιάζουν μια εξειδικευμένη
λειτουργικότητα για σχεσιακές βάσεις δεδομένων, e-mails κλπ.
• Μια προσφορά από εμπορικές υπηρεσίες διαδικτύου, οι οποίες
ονομάζονται .NET My Services, έναντι ενός χρηματικού ποσού, οι
χρήστες μπορούν να χρησιμοποιήσουν αυτές τις υπηρεσίες
κατασκευάζοντας εφαρμογές οι οποίες απαιτούν γνώση για την
ταυτότητα του χρήστη, κτλ.
• Νέες εφαρμογές για νέα περιβάλλοντα, όπως κινητά τηλέφωνα και
παιχνιδομηχανές.


2) Το .NET Framework

Το .NET της Microsoft δεν υποστηρίζει μόνο την ανεξαρτησία της
γλωσσάς, αλλά και την ολοκλήρωση της. Αυτό σημαίνει ότι μπορείς να
κληρονομήσεις από κλάσεις, να συλλάβεις τις εξαιρέσεις και να αποκτήσεις
πλεονέκτημα στον πολυμορφισμό μεταξύ των διαφόρων γλωσσών. Το .NET
Framework το κάνει αυτό εφικτό με μια προδιαγραφή η οποία ονομάζεται
Common Type System (CTS) στο οποίο όλα τα συστατικά του .NET θα
πρέπει να υπακούσουν. Για παράδειγμα, οτιδήποτε στο .NET είναι
αντικείμενο μιας συγκεκριμένης κλάσης η οποία προέρχεται από την κυρία
κλάση που ονομάζεται System.Object. Το CTS υποστηρίζει γενικευμένες
κλάσεις, αλληλεπιδράσεις με το γραφικό περιβάλλον, αναφορικούς τύπους
και τύπους οι οποίοι παίρνουν τιμές.
Επιπλέον, το .NET περιλαμβάνει το Common Language Specification
(CLS), το οποίο παρέχει μια σειρά από βασικούς κανόνες οι οποίοι
απαιτούνται για την ολοκλήρωση της γλωσσάς. Το CLS καθορίζει τις
ελάχιστες απαιτήσεις για τη χρησιμοποίηση της γλώσσας του .NET. Οι

11
μεταγλωττιστές οι οποίοι συμμορφώνονται με CLS δημιουργούν
αντικείμενα τα οποία μπορούν να αλληλεπιδράσουν μεταξύ τους. Ολόκληρο
το Framework Class Library (FCL) μπορεί να χρησιμοποιηθεί από
οποιαδήποτε γλώσσα η οποία συμμορφώνεται με το CLS.

Το .NET Framework εγκαθίσταται στην κορυφή του λειτουργικού
συστήματος, το οποίο μπορεί να είναι οποιαδήποτε έκδοση των Windows,
και να συμφωνεί με έναν αριθμό από συστατικά. Επομένως, το .NET
Framework συμφωνεί με :

• Τέσσερις επίσημες γλώσσες C#, VB.NET, Managed C++, και
JScript .NET
• Το Common Language Runtime (CLR), μια αντικειμενοστραφής
πλατφόρμα για Windows και για δικτυακό σχεδιασμό τα οποία
όλες αυτές οι γλώσσες μοιράζονται
• Έναν αριθμό από συσχετιζόμενες κλάσεις βιβλιοθηκών,
γνωστότερες και ως το Framework Class Library (FCL)






Εικόνα 1- Αρχιτεκτονική .NET Framework


12


Το πιο σημαντικό μέρος του .NET Framework είναι το CLR, το οποίο
παρέχει το περιβάλλον στο οποίο εκτελούνται τα προγράμματα. Το CLR
περιλαμβάνει μια εικονική μηχανή, όμοια σε πολλά σημεία με την εικονική
μηχανή της JAVA. Στο υψηλό επίπεδο, το CLR ενεργοποιεί τα αντικείμενα,
εκτελεί ελέγχους ασφαλείας σε αυτά, τα τοποθετεί αυτά πάνω στην μνήμη,
τα εκτελεί και στο τέλος μαζεύει τα σκουπίδια (garbage-collects).

Το
Common Type System είναι επίσης μέρος του CLR.

Στην Εικόνα 1 το υψηλότερο επίπεδο στο CLR, είναι ένα σύνολο
πλαισίων εργασίας από βασικές κλάσεις, ακολουθούμενο από ένα ακόμα
επίπεδο από δεδομένα και XML κλάσεις, συν ακόμα ένα επίπεδο από
κλάσεις προτεινόμενες για δικτυακές υπηρεσίες, δικτυακές φόρμες και
φόρμες για Windows. Αυτές οι κλάσεις είναι γνωστές σαν Framework
Class Library (FCL), μια από τις μεγαλύτερες κλάσεις βιβλιοθηκών στην
ιστορία και μια από τις οποίες παρέχουν ένα αντικειμενοστραφές API σε
όλες τις λειτουργίες που ενσωματώνει η πλατφόρμα του .NET.

Το σύνολο των βασικών κλάσεων του πλαισίου εργασίας, στο
χαμηλότερο επίπεδο του FCL, είναι παρόμοιο με το σύνολο των κλάσεων
της Java. Αυτές οι κλάσεις αναπτύσσουν στοιχειώδεις εισόδους και εξόδους,
διαχείριση των συμβολοσειρών, διαχείριση της ασφαλείας, επικοινωνία με
το δίκτυο, διαχείριση νημάτων, διαχείριση του κειμένου κλπ.

Πάνω από αυτό το επίπεδο υπάρχει μια σειρά από κλάσεις οι οποίες
επεκτείνουν τις βασικές κλάσεις στη διαχείριση των δεδομένων και στη
διαχείριση του XML. Οι κλάσεις των δεδομένων υποστηρίζουν μια συνεχή
διαχείριση των δεδομένων η οποία συντηρείται από βάσεις υποστήριξης.
Αυτές οι κλάσεις περιλαμβάνουν τις Structured Query Language (SQL)
κλάσεις που σε αφήνουν να διαχειριστείς τα συνεχή δεδομένα που
αποθηκεύονται από την SQL μέσω της αλληλεπίδρασης με το γραφικό
περιβάλλον. Επιπλέον ένα σύνολο από κλάσεις το οποίο καλείται
ADO.NET σου επιτρέπει να διαχειριστείς τα συνεχή δεδομένα. Το .NET
Framework υποστηρίζει έναν αριθμό κλάσεων που σου επιτρέπουν να
διαχειριστείς δεδομένα XML και να εκτελέσεις αναζητήσεις και
μεταφράσεις XML.

Επεκτείνοντας τις βασικές κλάσεις του πλαισίου εργασίας και των
δεδομένων και των κλάσεων XML, υπάρχει μια σειρά από κλάσεις για την

13
κατασκευή εφαρμογών χρησιμοποιώντας τρεις διαφορετικές τεχνολογίες:
δικτυακές υπηρεσίες, δικτυακές φόρμες και φόρμες των Windows. Οι
δικτυακές υπηρεσίες περιλαμβάνουν έναν αριθμό από κλάσεις οι οποίες
υποστηρίζουν την ανάπτυξη μικρής σπουδαιότητας συστατικών διανομής,
τα οποία θα δουλεύουν ακόμα και όταν αντιμετωπίζουν firewalls και
λογισμικό ΝΑΤ. Επειδή οι δικτυακές υπηρεσίες υιοθετούν τα HTTP και
SOAP σαν βασικά πρωτόκολλα επικοινωνίας, αυτά τα συστατικά
υποστηρίζουν την τοποθέτηση και την εκτέλεση τους στο Διαδίκτυο.

Οι δικτυακές φόρμες και οι φόρμες των Windows επιτρέπουν την
εφαρμογή γρήγορων τεχνικών ανάπτυξης εφαρμογών για την κατασκευή
δικτυακών και Windows εφαρμογών.


3) Μεταγλώττιση και το MSLI

Στο .NET, τα προγράμματα δεν μεταγλωττίζονται σε εκτελέσιμα αρχεία,
αλλά μεταγλωττίζονται σε Microsoft Intermediate Language (MSIL) αρχεία
τα οποία τα εκτελεί μετά το CLR. Τα MSLI αρχεία τα οποία παράγει η C#
είναι ακριβώς τα ίδια με τα IL αρχεία που παράγουν οι άλλες γλώσσες στο
.NET. Ένα κύριο γεγονός για την CLR είναι ότι το ίδιο runtime υποστηρίζει
την ανάπτυξη εφαρμογών τόσο σε C# όσο και σε VB.NET.

Ο κώδικας της C# μεταγλωττίζεται σε IL όταν εκτελείται το πρόγραμμα.
Το αρχείο IL αποθηκεύεται σε ένα μέρος του δίσκου. Όταν εκτελείται το
πρόγραμμα σου, το IL μεταγλωττίζεται ξανά, χρησιμοποιώντας τον Just In
Time (JIT) μεταγλωττιστή. Το αποτέλεσμα είναι κώδικας μηχανής ο οποίος
εκτελείται από τον επεξεργαστή του μηχανήματος.

Ο JIT μεταγλωττιστής τρέχει κατ’ απαίτηση. Όταν μια μέθοδος καλείται
ο μεταγλωττιστής JIT αναλύει το IL και παράγει υψηλά αποδοτικό κώδικα
μηχανής, ο οποίος τρέχει πολύ γρήγορα. Ο μεταγλωττιστής JIT είναι αρκετά
έξυπνος για να γνωρίζει ποτέ ο κώδικας έχει ήδη μεταγλωττιστεί, έτσι όταν
τρέχει η εφαρμογή, οι μεταγλωττίσεις γίνονται μόνον όταν αυτές
χρειάζονται. Καθώς η εφαρμογή του .NET τρέχει, τείνει να γίνει όλο και
γρηγορότερη, καθώς ο μεταγλωττισμένος κώδικας επαναχρησιμοποιείται.

Το CLS σημαίνει ότι όλες οι γλώσσες του .NET παράγουν παρόμοιο IL
κώδικα. Αυτό έχει σαν αποτέλεσμα αντικείμενα που δημιουργούνται στη
μια γλώσσα να μπορούν να εισαχθούν και να εξαχθούν από μια άλλη.

14
Επομένως είναι πιθανό να δημιουργηθεί μια βασική κλάση στο VB.NET και
να εξαχθεί σε C#.

4) Η γλώσσα C#

Η γλώσσα C# είναι αφοπλιστικά απλή, με περίπου 80 λέξεις κλειδιά και
δώδεκα περίπου ενσωματωμένους τύπους δεδομένων. Η C# είναι πολύ
εκφραστική όταν έρχεται να εκτελέσει καινούργιες προγραμματιστικές
ιδέες. Η C# περιλαμβάνει όλη την υποστήριξη για δομημένο, αποτελούμενο
από συστατικά, αντικειμενοστραφή προγραμματισμό, όπου ένας ειδικός στις
καινούργιες γλώσσες να μπορεί να δημιουργήσει με την βοήθεια της C++
και Java.

Στην καρδιά κάθε αντικειμενοστραφής γλώσσας, είναι η υποστήριξη της
να καθορίζει και να δουλεύει με κλάσεις. Οι κλάσεις καθορίζουν νέους
τύπους, επιτρέπουν να επεκτείνεις την γλώσσα σε ένα καλύτερο μοντέλο
του προβλήματος που προσπαθείς να λύσεις. Η C# περιέχει λέξεις κλειδιά
για τον ορισμό νέων κλάσεων και των μεθόδων τους και των ιδιοτήτων τους
και για να πραγματοποιεί την ενθυλάκωση , την κληρονομικότητα και τον
πολυμορφισμό. Τις τρεις βασικές ιδιότητες του αντικειμενοστραφούς
προγραμματισμού.

Οι κλάσεις προσδιορισμού της C# δεν απαιτούν ξεχωριστά αρχεία ή
Interface Definition Language (IDL) αρχεία. Η C# υποστηρίζει ένα νέο τύπο
XML για εσωτερική τεκμηρίωση, που απλοποιεί τη δημιουργία των άμεσα
συνδεδεμένων και εκτυπωμένων τεκμηρίων αναφοράς για μια εφαρμογή.

Στην C# μια κλάση μπορεί να κληρονομήσει μόνο από ένα γονέα, αλλά
μια κλάση μπορεί να διαχειριστεί πολλές αλληλεπιδράσεις.

Η C# επίσης εξασφαλίζει υποστήριξη για τις δομές, αλλά η έννοια της
δομής έχει αλλάξει σημαντικά από την C++. Στην C#, η δομή έχει λιγότερες
απαιτήσεις, από μια τυπική κλάση. Μια δομή δεν μπορεί να κληρονομήσει
από μια κλάση ή να κληρονομηθεί από αυτή, αλλά μια δομή μπορεί να
διαχειριστεί μια αλληλεπίδραση.

Η C# παρέχει χαρακτηριστικά των συστατικών της, όπως ιδιότητες και
γεγονότα. Τα συστατικά του προγραμματισμού της είναι υποστηρίξιμα από
το CLR για την αποθήκευση μετά-δεδομένων μαζί με κώδικα για την
κλάση. Τα μετά-δεδομένα που περιγράφουν την κλάση, περιλαμβάνοντας

15
τις μεθόδους και τα δεδομένα της, όπως και τις ανάγκες της ασφάλειας και
αλλά χαρακτηριστικά, και οτιδήποτε άλλο τοποθετούνται σε σειριακή
μορφή. Ο κώδικας περιέχει τη λογική σειρά για να μεταφερθούν οι
λειτουργίες. Μια μεταγλωττιζόμενη κλάση είναι επομένως μια αυτό-
εμπεριεχομένη μονάδα. Παρόλα αυτά ένα περιβάλλον που ξέρει πώς να
διαβάσει μια κλάση μετά-δεδομένων και ο κώδικας δεν χρειάζεται άλλες
πληροφορίες για να μπορέσει να το χρησιμοποιήσει. Χρησιμοποιώντας την
C# και το CLR είναι πιθανόν να προσθέσουμε συνήθη μετά-δεδομένα σε
μια κλάση για να δημιουργήσουμε συνήθη χαρακτηριστικά .

Μια assembly είναι μια συλλογή από αρχεία τα οποία εμφανίζονται στον
προγραμματιστή, σαν ένας απλός δεσμός βιβλιοθήκης (DLL) ή εκτελέσιμου
(EXE). Στο .NET μια assembly είναι η βασική μονάδα
επαναχρησιμοποίησης, έκδοσης, ασφαλείας και ανάπτυξης. Το CLR παρέχει
έναν αριθμό κλάσεων για τη διαχείριση των assemblies.

Μια τελική σημείωση για την C# είναι ότι παρέχει υποστήριξη για
απευθείας πρόσβαση στη μνήμη χρησιμοποιώντας τους δείκτες της C++.
Χρησιμοποιεί λέξεις κλειδιά για να αναστέλλει λειτουργίες που είναι
ανασφαλείς και για να προειδοποιεί τον CLR garbage collector να μην
συλλέγει αντικείμενα από δείκτες μέχρι αυτά να απελευθερωθούν.




2. Βάσεις Δεδομένων


Εισαγωγή στις βάσεις δεδομένων


Τα συστήματα διαχείρισης βάσεων δεδομένων είναι σήμερα απανταχού
παρόντα και συνιστούν το θεμελιώδες εργαλείο διαχείρισης της
πληροφορίας.
Μια βάση δεδομένων αποτελεί μια οποιαδήποτε συλλογή δεδομένων
που αφορούν τις δραστηριότητες ενός (ή περισσοτέρων
αλληλοσχετιζόμενων) οργανισμού. Για παράδειγμα, βάση δεδομένων
αποτελούν τα επιχειρησιακά δεδομένα ενός πανεπιστημίου που καταχωρούν
πληροφορίες για:

16

• Οντότητες στο χώρο του συστήματος, όπως φοιτητές, ακαδημαϊκοί,
μαθήματα και αίθουσες διδασκαλίας.
• Συσχετίσεις μεταξύ των οντοτήτων, όπως η συμμετοχή φοιτητών σε
μαθήματα διδασκαλία μαθημάτων από καθηγητές και η χρήση των
αιθουσών διδασκαλίας.

Τα Συστήματα Διαχείρισης Βάσεων Δεδομένων (DBMS) είναι
λογισμικό το οποίο είναι ειδικά σχεδιασμένο ώστε να διευκολύνει τη
χρήση και τη συντήρηση μεγάλου όγκου πληροφορίας. Το DBMS
αποτελεί σήμερα τύπο συστήματος, η ανάγκη χρήσης του οποίου
μεγαλώνει με γρήγορο ρυθμό. Εναλλακτική λύση του DBMS αποτελεί ο
αυτοσχεδιασμός, όπου όμως δεν διασφαλίζεται η συμβατότητα στην
μεταφορά δεδομένων από / προς άλλα αντίστοιχα περιβάλλοντα. Για
παράδειγμα μπορεί κάποιος να υλοποιήσει την εφαρμογή του σε
περιβάλλον τρίτης γενιάς προγραμματισμού (C++, java, C# κλπ) και να
διαχειρίζεται τα δεδομένα σε παραδοσιακού τύπου αρχεία. Αντίθετα, η
χρήση του DBMS έχει προτερήματα τα οποία αναφέρονται παρακάτω
στην ενότητα 2.1 .
Το DBMS σαν αντικείμενο έρευνας, εφαρμογής και διδασκαλίας,
μπορεί να θεωρηθεί ότι αποτελεί ένα μικρόκοσμο της επιστήμης των
υπολογιστών. Εμπεριέχει ένα ευρύ φάσμα θεμάτων και τεχνικών, όπως :
γλώσσες προγραμματισμού , αντικειμενοστρέφεια και αλλά
προγραμματιστικά παραδείγματα, μεταγλώττιση, λειτουργικά
συστήματα, ταυτόχρονο προγραμματισμό, δομές δεδομένων κλπ.


Τα προτερήματα του DBMS


Η χρήση του DBMS για τη διαχείριση των δεδομένων διακρίνεται από
ένα πλήθος προτερημάτων:

• Ανεξαρτησία δεδομένων: Οι εφαρμογές και ο προγραμματιστικός
τους κώδικας χρειάζεται να μην εξαρτώνται από λεπτομέρειες που
αφορούν την αναπαράσταση και την αποθήκευση των δεδομένων που
επεξεργάζονται. Το DBMS υποστηρίζει μια αφηγημένη έννοια
οπτικής επί των δεδομένων, σε τρόπο ώστε να ανεξαρτοποιεί τον

17
προγραμματιστικό κώδικα από αυτού του είδους τις λεπτομέρειες της
εσωτερικής αναπαράστασης της καταχωρημένης πληροφορίας.
• Ταχεία πρόσβαση στα δεδομένα: Το DBMS διαθέτει και εφαρμόζει
αυτόματα μια ποικιλία τεχνικών ώστε να καταχωρεί και να ανακτά τα
δεδομένα με παραγωγικό τρόπο. Αυτές του οι δυνατότητες
αναδεικνύονται ως ιδιαίτερα χρήσιμες στην περίπτωση όπου τα
δεδομένα καταχωρούνται σε εξωτερικές περιφερειακές μονάδες.
• Ακεραιότητα των δεδομένων και ασφάλεια: Όταν η προσπέλαση
στα δεδομένα γίνεται πάντα μέσω του DBMS, το τελευταίο μπορεί να
επιβάλλει περιορισμούς που αφορούν στην ακεραιότητα τους. Για
παράδειγμα, πριν καταχωρηθεί ο μισθός ενός υπαλλήλου της
εταιρίας, το DBMS ελέγχει ώστε η καταχώρηση να μην συνεπάγεται
με υπέρβαση στον προϋπολογισμό του τμήματος. Επίσης, το DBMS
μπορεί να επιβάλλει ελέγχους στην πρόσβαση των δεδομένων,
καθορίζοντας , από το σύνολο της πληροφορίας που καταχωρεί η
βάση, ποια τμήματα θα είναι προσπελάσιμα από τις διάφορες
κατηγορίες χρηστών και εφαρμογών.
• Διαχείριση των δεδομένων: Όταν συμβαίνει πολλοί χρήστες να
μοιράζονται την πρόσβαση στα ίδια δεδομένα, ο συγκεντρωτισμός
στη διαχείριση των δεδομένων επιφέρει μια σημαντική βελτίωση των
επιδόσεων του συστήματος. Οι έμπειροι τεχνολόγοι πληροφορικοί,
που αντιλαμβάνονται τη φύση και τη σημασιολογία της πληροφορίας
την οποία καταχωρεί η βάση, καθώς επίσης και τις ανάγκες που
πρεσβεύουν διάφορες ομάδες χρηστών, έχουν πλέον την δυνατότητα
(μέσω του DBMS) να οργανώσουν τα δεδομένα ώστε αυτά να
καταχωρούνται μόνο μια φορά (χωρίς περιττούς πλεονασμούς ), όπως
και να ρυθμίζουν κατάλληλα τα της φυσικής καταχώρισης των
δεδομένων σε τρόπο ώστε να μεγιστοποιούνται οι επιδόσεις του
συστήματος στην ανάκτηση της καταχωρημένης πληροφορίας.
• Ταυτόχρονη πρόσβαση και επαναφορά από βλάβη: Το DBMS
χρονοπρογραμματίζει την ταυτόχρονη πρόσβαση στα δεδομένα, έτσι
ώστε οι χρήστες να θεωρούν ότι μόνον ένας από αυτούς έχει
πρόσβαση στην καταχωρημένη πληροφορία κάθε μια χρονική στιγμή
της επεξεργασίας. Επίσης, το DBMS περιέχει όλα τα απαραίτητα
εφόδια στον χρήστη ώστε να κατοχυρώνει την ασφαλή επαναφορά
των δεδομένων του, στην περίπτωση βλάβης στο σύστημα.
• Μειωμένος χρόνος ανάπτυξης εφαρμογών: Το DBMS υποστηρίζει
και κάνει διαθέσιμα στο χρήστη ένα πλήθος υποσυστημάτων /
συναρτήσεων γενικής χρήσης που ενσωματώνονται εύκολα και

18
γρήγορα στην κάθε μια εφαρμογή της βάσης δεδομένων που
αναπτύσσεται. Σε συνδυασμό με την υποστήριξη μιας υψηλού
επιπέδου διεπαφής πρόσβασης στα δεδομένα, η δυνατότητα αυτή
διευκολύνει την ταχύτατη ανάπτυξη εφαρμογών DBMS, και όχι μόνο:
οι εφαρμογές οι οποίες αναπτύσσονται με αυτόν τον τρόπο τείνουν να
είναι πιο αξιόπιστες στην λειτουργικότητα τους, σε σύγκριση με
άλλες, οι οποίες αναπτύσσονται από το μηδέν. Η εξήγηση αυτής της
υπεροχής είναι προφανής: στιγμές (συνήθως κρίσιμης, συνθέτης)
επεξεργασίας οι οποίες διεκπεραιώνονται με αυτόματο και αξιόπιστο
τρόπο από το DBMS χρειάζεται να διεκπεραιώνονται από επιπλέον
κώδικα στις παραδοσιακές (δηλ. μη- DBMS) εφαρμογές.


3. Το μοντέλο οντότητας-συσχέτισης (ER)


Το μοντέλο οντότητας-συσχέτισης (ER) των δεδομένων επιτρέπει και
καθιστά δυνατή την περιγραφή των δεδομένων μιας πραγματικής
επιχείρησης, απεικονίζοντας αντικείμενα και συσχετίσεις, και αποτελεί
δημοφιλή μεθοδολογία ανάπτυξης του αρχικού σχεδιασμού μιας βάσης
δεδομένων.
Ο ρόλος του μοντέλου ER στο σχεδιασμό βάσεων δεδομένων είναι
σημαντικός και κύριος. Η μεθοδολογία ER συμπεριλαμβάνει χρήσιμες
έννοιες οι οποίες μας επιτρέπουν να μεταβαίνουμε από μια άτυπη περιγραφή
των πληροφοριακών αναγκών, όπως τις διατυπώνουν οι χρήστες, σε μια
λεπτομερή και επακριβή περιγραφή που αποτελεί αναγκαία προϋπόθεση για
την υλοποίηση της κάθε εφαρμογής στο DBMS. Ξεκινάμε με μια
επισκόπηση του σχεδιασμού της βάσης δεδομένων, η οποία εμπνέει την
ανάλυση της μεθοδολογίας ER στην συνεχεία. Στο γενικότερο χώρο της
διαδικασίας σχεδιασμού μιας βάσης εφαρμογής, το μοντέλο ER αποτελεί το
στάδιο εκείνο το οποίο ονομάζεται σχεδιασμός της ιδεατής βάσης
δεδομένων. Προχωρούμε εισάγοντας τη μεθοδολογία ER και στο τέλος
εξετάζουμε θέματα σχεδιασμού βάσης δεδομένων με το μοντέλο ER.


19
3.1 Επισκόπηση του σχεδιασμού βάσης δεδομένων


Η διαδικασία του σχεδιασμού βάσης δεδομένων μπορεί να υποδιαιρεθεί
σε έξι διακριτά στάδια. Το μοντέλο ER σχετίζεται κυρίως με τα τρία πρώτα
στάδια αυτής της υποδιαίρεσης:

(1) Ανάλυση των Απαιτήσεων:
Το πρώτο στάδιο του σχεδιασμού εφαρμογής βάσης δεδομένων αφορά
στην κατανόηση και στην καταγραφή του είδους των δεδομένων τα
οποία πρόκειται να καταχωρεί η βάση και των επιμέρους εφαρμογών που
θα διαχειρίζονται αυτά τα δεδομένα, καθώς επίσης με την επισήμανση
εκείνων των λειτουργιών που συμβαίνουν με την μεγαλύτερη συχνότητα
και θα επηρεάζουν την απόδοση του συστήματος. Με αλλά λόγια
χρειάζεται να επισημανθεί αυτό που επιθυμούν και περιμένουν οι
χρήστες από την βάση δεδομένων. Από τη φύση του, το στάδιο αυτό δεν
είναι δυνατόν να τυποποιηθεί καθώς περιλαμβάνει συζητήσεις με
ομάδες χρηστών, καταγραφή και τεκμηρίωση της τρέχουσας
λειτουργικότητας και ροής των διαδικασιών χωρίς την βάση δεδομένων,
των βελτιώσεων που αναμένεται να εισάγει η βάση δεδομένων, κλπ. Για
την μεθοδική συλλογή, καταγραφή και οργάνωση της πληροφορίας που
έχει να κάνει με αυτό το στάδιο της ανάλυσης, έχουν προταθεί άλλες
μεθοδολογίες. Μάλιστα, μερικές από τις τελευταίες αυτοματοποιούνται
και υποστηρίζονται από λογισμικό σχεδιασμού βάσης δεδομένων.



(2) Σχεδιασμός της Ιδεατής Βάσης Δεδομένων:
Το σύνολο της πληροφορίας η οποία συγκεντρώθηκε και οργανώθηκε
στο πρώτο στάδιο (Ανάλυση των απαιτήσεων) χρησιμοποιείται για να
περιγράφουν, σε υψηλό επίπεδο, οι δομές που πρόκειται να
καταχωρήσουν τα δεδομένα στην βάση, καθώς επίσης οι περιορισμοί επί
των δεδομένων που επιβάλλει το πληροφοριακό σύστημα. Στο στάδιο
αυτό του σχεδιασμού γίνεται συνήθως χρήση του μοντέλου ER, η
κάποιας ανάλογης μεθοδολογίας μοντελοποίησης των δεδομένων σε
υψηλό επίπεδο.

(3) Σχεδιασμός της Λογικής Βάσης Δεδομένων:
Το στάδιο αυτό περιλαμβάνει την επιλογή του DBMS όπου πρόκειται να
υλοποιηθεί η βάση δεδομένων. Στην συνεχεία, η ιδεατή βάση δεδομένων
μετασχηματίζεται σε σχήμα βάσης δεδομένων του συγκεκριμένου

20
μοντέλου του DBMS που πρόκειται να χρησιμοποιηθεί για την
υλοποίηση της. Το ιδεατό σχήμα το οποίο προκύπτει στο σχεσιακό
μοντέλο δεδομένων ονομάζεται και λογικό σχήμα.

Η μεθοδολογία του μοντέλου ER θεωρείται συχνά ότι αποτελεί μια
ολοκληρωμένη προσέγγιση του σχεδιασμού του λογικού σχήματος βάσης
δεδομένων, ωστόσο αυτό είναι λάθος. Το διάγραμμα ER περιγράφει τα
δεδομένα μόνον κατά προσέγγιση και, επιπλέον, κατασκευάζεται με ένα
πολύ υποκειμενικό τρόπο αξιολόγησης της πληροφορίας που έχει
συγκεντρωθεί και οργανωθεί κατά το στάδιο της ανάλυσης των απαιτήσεων.
Μια πιο προσεκτική ανάλυση βελτιώνει συχνά το λογικό σχήμα το οποίο
προκύπτει στο τέλος του τρίτου σταδίου της ανάλυσης. Από την στιγμή που
έχουμε συντάξει ένα καλό λογικό σχήμα, συνυπολογίζουμε ζητήματα που
αφορούν στην βελτίωση των επιδόσεων του υπό σχεδιασμού συστήματος
και κατασκευάζουμε το φυσικό σχήμα της βάσης δεδομένων. Τέλος,
λαμβάνουμε υπόψη θέματα που αφορούν την ασφάλεια της καταχωρημένης
πληροφορίας, όπως και θέματα κατανομής αρμοδιοτήτων στην
λειτουργικότητα την οποία θα μπορούν να έχουν διάφοροι χρήστες ή
κατηγορίες χρηστών ώστε να έχουν πρόσβαση σε δεδομένα που τους
αφορούν και όχι σε δεδομένα που θέλουμε να τους αποκρύπτουμε.

(4) Tελειοποίηση του Σχήματος:
Το τέταρτο στάδιο στο σχεδιασμό βάσης δεδομένων αφορά την ανάλυση
της συλλογής των πινάκων του σχεσιακού μας σχήματος με στόχο την
τελειοποίηση του ώστε να αντιμετωπίζονται με επιτυχία προβλήματα τα
οποία εξακολουθούν να υπάρχουν. Σε αντίθεση με τα στάδια ανάλυσης
των απαιτήσεων και του σχεδιασμού του ιδεατού σχήματος, τα οποία
εμπεριέχουν υποκειμενισμό, για την τελειοποίηση του σχήματος
εφαρμόζεται μια ελκυστική και δυναμική θεωρία. Η θεωρία της
κανονικοποίησης των πινάκων ( δηλαδή ο καθορισμός της δομής τους
ώστε να πληρούνται κάποιες επιθυμητές ιδιότητες ).

(5) Σχεδιασμός του Φυσικού Σχήματος:
Στο στάδιο αυτό λαμβάνουμε υπόψη τυπικές περιπτώσεις αναμενομένης
επιβάρυνσης της επεξεργασίας της υπό ανάπτυξης βάσης δεδομένων. Ο
σχεδιασμός της υλοποιείται ώστε το σύστημα να επιτυγχάνει
ικανοποιητικά μεγέθη αποδοτικότητας. Το στάδιο μπορεί απλά να
περιλαμβάνει τη δημιουργία κάποιων ευρετηρίων ή
/ και τη φυσική
ομαδοποίηση των εγγραφών σε ορισμένους πίνακες, όπως επίσης και την

21
ουσιαστική επανεξέταση και τροποποίηση τμημάτων του σχήματος της
βάσης που προέκυψαν σε προηγούμενα στάδια του σχεδιασμού της.



(6) Σχεδιασμός της Πολιτικής της Ασφαλείας:
Στο στάδιο αυτό κατατάσσουμε τους χρήστες σε ομάδες και ορίζουμε
διακριτούς ρόλους για την κάθε μια ομάδα χρηστών ( π.χ. την ομάδα
ανάπτυξης ενός προϊόντος, τους αντιπροσώπους των πελατών, τον
υπεύθυνο για κάθε προϊόν). Για κάθε ένα ρόλο και ομάδα,
προσδιορίζουμε τα τμήματα της βάσης δεδομένων οπού θα υπάρχει
πρόσβαση καθώς επίσης και τα τμήματα εκείνα της βάσης δεδομένων
όπου δεν θα επιτρέπεται να υπάρχει πρόσβαση. Στη συνέχεια
λαμβάνουμε όλα τα κατάλληλα μέτρα ώστε ο καθένας να έχει πρόσβαση
μόνο στο τμήμα εκείνο της βάσης όπου πρέπει να έχει πρόσβαση. Το
DBMS υποστηρίζει τους μηχανισμούς εκείνους οι οποίοι υποβοηθούν
στην υλοποίηση αυτών των σχημάτων ασφαλείας.

Η υποδιαίρεση του σχεδιασμού της βάσης δεδομένων σε στάδια,
όπως γίνεται στα προηγούμενα, πρέπει να θεωρηθεί ότι αποτελεί
κατηγοριοποίηση των διαφόρων τύπων σταδίων στην όλη διαδικασία. Αν
και θα μπορούσαμε να εφαρμόσουμε τα έξι αυτά στάδια και να σχεδιάσουμε
μια ολοκληρωμένη βάση δεδομένων, στην πράξη θα συνεχίζαμε με ένα
επόμενο στάδιο ρύθμισης του σχήματος οπού θα συνυπήρχαν
εναλλασσόμενα και τα έξι βασικά στάδια του σχεδιασμού, σε τρόπο ώστε να
διασφαλίζεται η ορθότητα του υπό σχεδιασμού συστήματος.
Οι έννοιες και οι τεχνικές που σχετίζονται με τα εσωτερικά σημεία
του σχεσιακού DBMS συνιστούν γνώση την οποία χρειάζεται να έχει
κάποιος του οποίου ο ρόλος είναι να αναπτύσσει και να συντηρεί τον
εσωτερικό κώδικα του συστήματος διαχείρισης βάσεων δεδομένων. Όμως,
είναι πολύ σημαντικό να γίνει κατανοητό πως οι εξουσιοδοτημένοι χρήστες,
όπως και ο διαχειριστής της βάσης δεδομένων, χρειάζεται να έχουν γνώση
και του τρόπου με τον οποίο λειτουργεί DBMS. Η καλή γνώση της
εσωτερικής λειτουργικότητας του συστήματος είναι ουσιαστικής σημασίας
για εκείνον ο οποίος θέλει να εκμεταλλευτεί πλήρως τις δυνατότητες του
DBMS και επιθυμεί να σχεδιάσει ένα καλό σύστημα διαχείρισης βάσεων
δεδομένων. Οι στόχοι αυτοί επιτυγχάνονται κυρίως με το σωστό σχεδιασμό
του φυσικού σχήματος και της σωστής ρύθμισης της βάσης δεδομένων.


22
Κεφάλαιο 3



1. Περιγραφή του Microsoft SQL Server
Management Studio Express



Το SQL Server Studio Management Express είναι το εργαλείο το οποίο
χρησιμοποιήθηκε για τη δημιουργία της βάσης δεδομένων για το
πληροφοριακό σύστημα παραγγελιών.
Με αυτό το εργαλείο δημιουργήθηκαν οι πίνακες της βάσης,
προσδιορίστηκαν τα κυρία κλειδιά και οι αλληλοσχετίσεις των πινάκων,
φτιάχτηκαν οι triggers μέσα στους πίνακες για να εκτελέσουνε αυτόματα
κάποιες διεργασίες κατά την εισαγωγή των εγγραφών στον πίνακα. Επίσης,
δημιουργήθηκαν μέσα στην βάση δεδομένων ορισμένες συναρτήσεις
(functions), οι οποίες καλούνται από την εφαρμογή για να εκτελέσουν
εντολές στην βάση και να επιστρέψουν τα αποτελέσματα πίσω στην
εφαρμογή.
Με το εργαλείο αυτό επίσης, είναι δυνατό να προσφερθεί ασφάλεια στη
βάση. Δημιουργήθηκαν χρήστες οι οποίοι μπορούν να κάνουν login στο
SQL Server Studio Management, και στους οποίους εκχωρήθηκαν
δικαιώματα για το τι μπορούν να κάνουν. Ενώ κάποιος μπορεί να κάνει
login στο SQL Server Studio Management, δεν σημαίνει ότι μπορεί να
προσπελάσει μια οποιαδήποτε βάση δεδομένων, εκτός βέβαια και αν κάνει
login με Windows Authentication. Η κάθε βάση δεδομένων έχει τη δική της
ασφάλεια, η οποία περιέχει
χρήστες οι οποίοι είναι ήδη εγγεγραμμένοι στο
SQL Server Studio Management. Εκεί γίνεται να τους εκχωρήσουμε
διαφορετικά δικαιώματα από ότι έχουν κατά την δημιουργία τους στο SQL
Server Studio Management.
Στη συνέχεια περιγράφεται ο τρόπος με τον οποίο γίνεται η δημιουργία
χρηστών, καθώς και ο τρόπος σύνδεσης τους στη βάση.



23
2. Απομακρυσμένη σύνδεση και δημιουργία
χρηστών στην βάση



Σε αυτήν την ενότητα θα περιγράψουμε πως θα υλοποιείται η δημιουργία
μιας σύνδεσης ανάμεσα στην εφαρμογή και την βάση δεδομένων.
Αν θέλουμε η εφαρμογή να τρέχει σε τοπικό επίπεδο τότε η λύση είναι
απλή. Κάνουμε εγκατάσταση το SQL Server 2005, εκτός και αν έχουμε
κάνει εγκατάσταση το Visual Studio 2005 το οποίο το περιέχει, μετά
κάνουμε εγκατάσταση το SQL Server Studio Management. Για να
συνδεθούμε σε τοπικό επίπεδο το μόνο που χρειαζόμαστε είναι να γίνει
σύνδεση με Windows Authentication όπως δείχνει και η παρακάτω εικόνα:


Εικόνα 1 – Είσοδος στο SQL Server Studio Management

Εφόσον, πραγματοποιηθεί η σύνδεση όπως δείχνει και η Εικόνα 1 τότε
εμφανίζεται στην οθόνη η παρακάτω εικόνα:


24

Εικόνα 2 – Κεντρικό παράθυρο

Στην παραπάνω εικόνα βλέπουμε το πλαίσιο εργασίας του SQL Server
Studio Management. Εάν επιλέξουμε το Databases, θα εμφανιστούν οι
βάσεις δεδομένων που έχουμε δημιουργήσει, και είναι το μέρος οπού
δημιουργούνται οι καινούργιες βάσεις δεδομένων. Στην επιλογή Security
έχουμε δυο επιλογές. Την επιλογή Logins, οπού μπορούμε να
δημιουργήσουμε καινούργιους χρήστες οι οποίοι θα έχουν πρόσβαση στο
SQL Server Studio Management. Βεβαία αυτό θα το χρησιμοποιήσουμε
όταν θα δούμε πως γίνεται απομακρυσμένη σύνδεση στη βάση, όταν
δουλεύουμε σε τοπικά δεν θα μας χρειαστεί άλλος λογαριασμός, εκτός και
αν χρησιμοποιείται το σύστημα μας , και φυσικά η εφαρμογή μας, από
κάποιον άλλον χρήστη, οπότε και θα χρειαστεί η δημιουργία ενός χρήστη. Η
άλλη επιλογή είναι το Server Roles, οπού υπάρχουν οι ομάδες χρηστών του
SQL Server Studio Management, οι οποίες μπορεί να προσδιορίσουν ένα
χρήστη για τον ρόλο του.


25
Τώρα για να μπορεί η εφαρμογή να έχει μια απομακρυσμένη σύνδεση με
τη βάση θα πρέπει να γίνουν κάποιες ενέργειες. Πηγαίνουμε πρώτα στο
μενού των Windows και από τα προγράμματα μας επιλέγουμε το SQL
Server 2005 και την επιλογή του SQL Server Configuration Manager, τότε
εμφανίζεται η παρακάτω εικόνα:



Εικόνα 3 – SQL Server Configuration Manager

Όταν εμφανιστεί το παραπάνω πλαίσιο στον υπολογιστή μας τότε
κάνουμε κλικ στο SQL Server 2005 Network Manager και κάνουμε Enable
το πρωτόσκολο TCP/IP. Έπειτα κάνουμε δεξί κλικ πάνω στο TCP/IP και
επιλέγουμε τις ιδιότητες. Εκεί, δίνουμε το αριθμό της πόρτας (port) στο
οποίο θα δουλεύει ο SQL Server 2005, στο τοπικό μας δίκτυο.
Έπειτα, επιλέγουμε το SQL Native Client Configuration και από εκεί το
Client Protocols και κάνουμε Enable το πρωτόσκολο TCP/IP. Έπειτα
κάνουμε δεξί κλικ πάνω στο TCP/IP και επιλέγουμε τις ιδιότητες. Εκεί,
δίνουμε το αριθμό της πόρτας (port), την οποία θα χρησιμοποιεί ο χρήστης
για να κάνει σύνδεση με την βάση.

26
Βεβαία, τα παραπάνω προϋποθέτουν ότι θα έχουμε ήδη ανοίξει την
πόρτα στο firewall του υπολογιστή μας, όπως και σε άλλες συσκευές τις
οποίες χρησιμοποιούμε, routers κ.α.
Αφού ολοκληρωθούν τα παραπάνω βήματα κάνουμε κλικ στο SQL
Server 2005 Services και επανεκκινούμε τον SQL Server 2005 όπως και
στην παρακάτω εικόνα:



Εικόνα 4 – επανεκκίνηση SQL Server

Μόλις τελειώσουμε με τα παραπάνω, κάνουμε σύνδεση στο SQL Server
Studio Management όπως δείξαμε και κάνουμε δεξί κλικ στο όνομα του
Server και επιλέγουμε ιδιότητες. Τότε εμφανίζεται η παρακάτω εικόνα:


27


Εικόνα 5 – Ιδιότητες του Server

Κάνουμε κλικ στην επιλογή Connections και ελέγχουμε ώστε να είναι
ενεργοποιημένο το Allow remote connections to this server, έπειτα κάνουμε
κλικ στην επιλογή Security και από εκεί επιλεγούμε το SQL Server and
Windows Authentication Mode και μετά πατάμε το ΟΚ. Εφόσον τελειώσαμε
με τα παραπάνω πηγαίνουμε στο κεντρικό πλαίσιο εργασίας του SQL Server
Studio Management και επιλεγούμε Security Logins, εκεί κάνουμε δεξί
κλικ και επιλέγουμε New Login. Τότε εμφανίζεται στην οθόνη μας η
παρακάτω εικόνα:


28


Εικόνα 6 – Νέος χρήστης

Όπως βλέπουμε και στην Εικόνα 6 στην επιλογή General, πηγαίνουμε εκεί
που λέει Login Name και γραφούμε το όνομα του χρήστη που θέλουμε να
έχει πρόσβαση στο SQL Server Studio Management, έπειτα επιλέγουμε το
πεδίο SQL Server Authentication και εισάγουμε τον κωδικό που επιθυμούμε.
Ακόμα, μπορούμε να επιλέξουμε μια προκαθορισμένη βάση δεδομένων και
γλώσσα που θα χρησιμοποιεί ο χρήστης. Βεβαίως, ο χρήστης θα μπορεί να
χρησιμοποιήσει και άλλη βάση δεδομένων, αρκεί να τον εισάγουμε στο
Security της βάσης δεδομένων. Εάν θέλουμε να δώσουμε στον χρήστη
κάποιο ρόλο που θα έχει στο Server τότε επιλέγουμε το Server Roles όπου
και αναγράφονται οι ρόλοι που θα έχει ο χρήστης. Εάν θέλουμε να του
δώσουμε πρόσβαση και σε μια άλλη βάση δεδομένων, πέρα της
προκαθορισμένης, τότε πηγαίνουμε στο User Mapping και επιλέγουμε σε
ποια άλλη από τις υπάρχουσες βάσεις θέλουμε να έχει πρόσβαση και τι θα

29
μπορεί να κάνει πάνω στην βάση. Τέλος πατάμε το ΟΚ και τελειώνουμε με
την δημιουργία του χρήστη.
Για την δημιουργία μιας καινούργιας βάσης δεδομένων, κάνουμε δεξί
κλικ στο πεδίο Databases New Database όπως φαίνεται και στην
εικόνα 7
,
οπού ανοίγει ένα καινούργιο παράθυρο, και στο πεδιο General ζητείται να
συμπληρωθεί το όνομα της βάσης και να δηλωθεί ο ιδιοκτήτης της. Στο
πεδιο options υπάρχουν κάποιες επιλογές που μπορούν να επιλεχθούν κατά
την δημιουργία της βάσης.


Εικόνα 7– Νέα βάση δεδομένων


Εφόσον, τώρα έχει δημιουργηθεί μια βάση δεδομένων και θέλουμε να
αλλάξουμε κάποιες ιδιότητες όπως πχ ο ιδιοκτήτης (owner) της βάσης,
κάνουμε δεξί κλικ στο όνομα της βάσης και επιλέγουμε ιδιότητες. Τότε
εμφανίζεται ένα νέο παράθυρο το οποίο έχει κάποια πεδία με επιλογές τις
οποίες μπορούμε να αλλάξουμε.
Για να κάνουμε back up μια βάση τότε κάνουμε δεξί κλικ πάνω στο
όνομα της βάσης που θέλουμε να υποθηκεύσουμε και επιλεγούμε Tasks
Back up. Αντίθετα, για να επαναφέρουμε στο σύστημα μας μια βάση που
είναι σωσμένη σε κάποιο αρχείο, τότε κάνουμε δεξί κλικ στο πεδίο

30
Databases Restore και επιλέγουμε το αρχείο της βάσης για επαναφορά
στο σύστημα μας.
Εάν αργότερα δημιουργήσουμε μια καινούργια βάση δεδομένων και
θέλουμε να δώσουμε πρόσβαση σε κάποιον ήδη υπάρχοντα χρήστη, τότε
επιλεγούμε την βάση που επιθυμούμε και πηγαίνουμε στο Security Users
New User. Το παραπάνω φαίνεται στην εικόνα:



Εικόνα 8 – Νέος χρήστης

Στην φόρμα που εμφανίζεται, γραφούμε το όνομα του χρήστη και στο
Login Name επιλέγουμε έναν χρήστη που υπάρχει ήδη στο Security του
SQL Server Studio Management. Τέλος, επιλέγουμε το ρόλο που θα έχει ο
χρήστης στη νέα βάση δεδομένων.
Εφόσον έχουμε κάνει όλα τα παραπάνω, μπορούμε να κάνουμε τώρα μια
απομακρυσμένη σύνδεση με την βάση ή της εφαρμογής με την βάση. Η
σύνδεση θα πραγματοποιηθεί όπως στην παρακάτω εικόνα:


31


Εικόνα 9 – Απομακρυσμένη σύνδεση

Στην επιλογή Server Name δίνουμε την IP, το όνομα του SQL Server
και την πόρτα που έχουμε ανοίξει. Στο Authentication επιλέγουμε το SQL
Server Authentication και μετά δίνουμε το όνομα του χρήστη και το
συνθηματικό.

Τα παραπάνω δεδομένα θα τα χρησιμοποιεί και το πληροφοριακό
σύστημα που αναπτύξαμε, αλλά θα υπάρχει και επιλογή ώστε να μπορούν
να τροποποιηθούν.
Στο κεφάλαιο 5 όπου γίνεται αναφορά στο εγχειρίδιο θα γίνει
παρουσίαση το πώς δημιουργείται η βάση και το πώς δημιουργούνται οι
πρώτες εγγραφές με την βοήθεια ενός προγράμματος εγκατάστασης το
οποιο αναλαμβάνει την εκτέλεση κάποιων scripts ώστε να εγκαταστήσει την
βάση στον υπολογιστή.
Ακόμα, στο πεδίο Server Objects Backup Devices του SQL Server
Studio Management, δημιουργήθηκε μια εικονική συσκευή αποθήκευσης
οπού θα μπορεί ο διαχειριστής να κάνει backup την βάση μέσω του κυρίως
προγράμματος όπως θα δούμε και στο κεφαλαίο 5. Στην
Εικόνα 10
παρουσιάζεται το πώς δημιουργείται αυτή η εικονική συσκευή:


32


Εικόνα 10 – δημιουργία backup device













33
Κεφάλαιο 4



1. Περιγραφή της βάσης των προμηθειών


Σε αυτό το κεφάλαιο γίνεται περιγραφή της δομής και της λειτουργίας
της βάσης που δημιουργήθηκε στο SQL Server Studio Management. Η βάση
των προμηθειών περιλαμβάνει δεκαεπτά πίνακες, όμως παρά το μεγάλο
μέγεθος της βάσης έγινε προσπάθεια να περιοριστούν οι πίνακες και τα
πεδία τους, ενώ έγινε κανονικοποίηση στους περισσότερους από τους
αρχικούς πίνακες ώστε να απλοποιηθούν και να γίνουν πιο λειτουργικοί
κατά την εκτέλεση τους από την βάση και το πρόγραμμα.

Πρώτα θα ξεκινήσουμε με τις λειτουργίες τις οποίες περιλαμβάνει το
SQL Server Studio Management σε μια βάση δεδομένων. Η πρώτη,
αναφέρεται στο διάγραμμα βάσης, βλέπε Εικόνα 1. Παρουσιάζεται ένα
σχεδιάγραμμα το οποίο περιλαμβάνει όλους τους πινακες της βασης και τα
χαρακτηριστικα τους, καθως και τις αλληλοσυσχετίσεις με τους άλλους
πίνακες. Αποτελεί ένα απλό και εύκολο τρόπο να «διαβάσει» κάποιος πιο
εύκολα την βάση και να κατανοήσει τον σχεδιασμό της και λειτουργία της.
Επίσης, από το σχεδιάγραμμα μπορούν να επεξεργαστούν ορισμένα από τα
πεδία των πινάκων της. Για να εμφανιστεί το διάγραμμα, χρειάζεται να
υπάρχει κάποιος ιδιοκτήτης (owner) στην βάση που δημιουργήθηκε. Η
δημιουργία ενός owner παρουσιάζεται στο Κεφαλαίο 3.


34


Εικόνα 1 – Πεδία της Βάσης Prom


Η επόμενη λειτουργία περιλαμβάνει τους πίνακες της βάσης. Εδώ
δημιουργούνται τα χαρακτηριστικά του κάθε πίνακα, ορίζονται τα κύρια και
ξένα κλειδιά, καθώς και οι αλληλοσυσχετίσεις των πινάκων μεταξύ τους.
Στην Εικόνα 2 βλέπουμε ένα στιγμιότυπο κατά την δημιουργία ενός πίνακα.
Ακόμα, μέσα στους πίνακες έχουμε γράψει κάποιους triggers ώστε να
πραγματοποιούν αυτόματα κάποιες εργασίες μέσα στον πίνακα κατά τη
διάρκεια της εισαγωγής ή ενημέρωσης μιας εγγραφής. Στο πεδίο των όψεων
(views), δημιουργήσαμε views τα οποία χρησιμοποιούνται ως αναφορές
παραγγελιών ή προμηθευτών. Στο κυρίως πρόγραμμα οι αναφορές
συλλέγουν πληροφορίες από αρκετούς πίνακες της βάσης για να τις
εμφανίσουν όταν κληθούν. Η επόμενη λειτουργία είναι αυτή του
προγραμματισμού (programmability), στην οποία υπάρχουν κάποιες
συναρτήσεις οι οποίες καλούνται από το κυρίως πρόγραμμα για να
διεκπεραιώνουν κάποιες λειτουργίες στην βάση. Τέλος, στο πεδίο της
ασφαλείας (security), ορίζονται ποιοι χρήστες θα έχουν πρόσβαση μέσα στη
συγκεκριμένη βάση καθώς και το ρόλο τους μέσα σε αυτήν.


35

Εικόνα 2 – Δημιουργία πίνακα

Εφόσον, είδαμε τι ακριβώς περιέχει μια βάση δεδομένων έφτασε η ώρα
της ανάλυσης του κάθε στοιχείου της βάσης.


1.1 Οι πίνακες της βάσης προμηθειών

Στους παρακάτω πίνακες που θα αναφέρουμε θα δίνεται η υλοποίηση
του κώδικα τους, θα γίνεται αναφορά στο σκοπό τον οποίο εξυπηρετούν και
θα παρουσιάζονται οι triggers που τυχόν υπάρχουν σε κάθε πίνακα. Οι
πίνακες είναι οι εξής:

1. Περιοχή (Region)

Στον πίνακα αυτόν αναγράφονται το όνομα και ο κωδικός της περιοχής,
ο οποίος είναι κύριο κλειδί. Ο κώδικας δημιουργίας αυτού του πίνακα είναι
ο παρακάτω:




36

USE [prom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[REGION](
[REGION_ID] [int] NOT NULL,
[REGION_NAME] [varchar](30) COLLATE Greek_CI_AS NOT NULL,
CONSTRAINT [PK_REGION] PRIMARY KEY CLUSTERED
(
[REGION_ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

2. Πόλη (City)

Στον πίνακα της πόλης, υπάρχει το όνομα της πόλης, ο κωδικός της που
είναι και κύριο κλειδί, ο νομός στον οποίο ανήκει και τέλος ο κωδικός
περιοχής ο οποίος είναι ξένο κλειδί από τον πίνακα της περιοχής. Ο
κώδικας δημιουργίας αυτού του πίνακα είναι ο εξής:

USE [prom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[CITY](
[CITY_ID] [int] NOT NULL,
[NAME] [varchar](25) COLLATE Greek_CI_AS NOT NULL,
[REGION_ID] [int] NOT NULL,
[NOMOS] [varchar](30) COLLATE Greek_CI_AS NOT NULL,
CONSTRAINT [PK_CITY] PRIMARY KEY CLUSTERED
([CITY_ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[CITY] WITH CHECK ADD CONSTRAINT
[FK_CITY_REGION] FOREIGN KEY([REGION_ID])
REFERENCES [dbo].[REGION] ([REGION_ID])
GO
ALTER TABLE [dbo].[CITY] CHECK CONSTRAINT [FK_CITY_REGION]

37

3. Τμήμα (Department)

Το τμήμα περιέχει το όνομα του, τον κωδικό του τμήματος που είναι το
κύριο κλειδί, την τοποθεσία του, το τηλέφωνό του, το κωδικό της πόλης το
οποίο είναι ξένο κλειδί στον πίνακα της πόλης και δείχνει σε ποια πόλη
ανήκει το τμήμα και τέλος τον κωδικό του τμήματος γονέα, το οποίο είναι
ξένο κλειδί στον πίνακα του τμήματος και δείχνει σε ποια θέση βρίσκεται το
συγκεκριμένο τμήμα στην ιεραρχία και την διάρθρωση όλων των τμημάτων
της επιχείρησης. Ο κώδικας για την δημιουργία του πίνακα είναι:

USE [prom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[DEPARTMENT](
[DEP_ID] [int] NOT NULL,
[NAME] [varchar](30) COLLATE Greek_CI_AS NOT NULL,
[LOCATION] [varchar](40) COLLATE Greek_CI_AS NOT NULL,
[PHONE] [varchar](15) COLLATE Greek_CI_AS NOT NULL,
[PARENT_DEPARTMENT_ID] [int] NULL,
[CITY_ID] [int] NOT NULL,
CONSTRAINT [PK_DEPARTMENT] PRIMARY KEY CLUSTERED
(
[DEP_ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[DEPARTMENT] WITH CHECK ADD CONSTRAINT
[FK_DEPARTMENT_CITY] FOREIGN KEY([CITY_ID])
REFERENCES [dbo].[CITY] ([CITY_ID])
GO
ALTER TABLE [dbo].[DEPARTMENT] CHECK CONSTRAINT [FK_DEPARTMENT_CITY]
GO
ALTER TABLE [dbo].[DEPARTMENT] WITH CHECK ADD CONSTRAINT
[FK_DEPARTMENT_DEPARTMENT] FOREIGN KEY([PARENT_DEPARTMENT_ID])
REFERENCES [dbo].[DEPARTMENT] ([DEP_ID])
GO
ALTER TABLE [dbo].[DEPARTMENT] CHECK CONSTRAINT
[FK_DEPARTMENT_DEPARTMENT]





38
4. Υπάλληλος (Employee)

Ο πίνακας αυτός περιλαμβάνει τον κωδικό του υπαλλήλου που είναι το
κύριο κλειδί, το ποσό χρημάτων που του απομένει για τις αγορές του, το
rating το οποίο είναι ξένο κλειδί στον πίνακα Employee_budget και
προσδιορίζει την ιεραρχία του υπαλλήλου στην επιχείρηση, καθώς και το
ποσό που έχει στη διάθεση του για αγορές, όπως και το ποσό το οποίο
μπορεί να εγκρίνει για μια αίτηση που έρχεται σε αυτόν. Όσον αφορά τις
βαθμίδες της ιεραρχίας των υπαλλήλων, αυτές συμφωνά με το rating είναι:

1. Διευθύνων σύμβουλος της εταιρίας
2. Περιφερειακός Διευθυντής
3. Τομεάρχης
4. Διευθυντής Καταστήματος
5. Διευθυντής Τμήματος ενός Καταστήματος
6. Προϊστάμενος Τμήματος
7. Υπάλληλος

Επόμενα χαρακτηριστικά αυτού του πίνακα είναι ο κωδικός του
τμήματος το οποίο είναι ξένο κλειδί από το τμήμα και δείχνει σε ποιο τμήμα
δουλεύει ο συγκεκριμένος υπάλληλος, ο κωδικός του προϊσταμένου
(Supervisor_id) το οποίο είναι ξένο κλειδί στον ίδιο πίνακα και προσδιορίζει
ποιον έχει προϊστάμενο ο συγκεκριμένος υπάλληλος και ο τύπος του
υπαλλήλου (type), το οποίο είναι ξένο κλειδί από τον πίνακα
Employee_type και προσδιορίζει με ποια ειδικότητα θα κάνει κάποιος login
στο πρόγραμμα και τι θα μπορεί να χρησιμοποιήσει. Ο κώδικας για την
δημιουργία του πίνακα είναι:

USE [prom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[EMPLOYEE](
[EMP_ID] [int] IDENTITY(1,1) NOT NULL,
[RATING] [tinyint] NOT NULL,
[DEP_ID] [int] NOT NULL,
[SUPERVISOR_ID] [int] NULL,
[type] [tinyint] NOT NULL,
[remaining_money] [real] NULL,
CONSTRAINT [PK_EMPLOYEE] PRIMARY KEY CLUSTERED
(
[EMP_ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]

39
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[EMPLOYEE] WITH CHECK ADD CONSTRAINT
[FK_EMPLOYEE_DEPARTMENT] FOREIGN KEY([DEP_ID])
REFERENCES [dbo].[DEPARTMENT] ([DEP_ID])
GO
ALTER TABLE [dbo].[EMPLOYEE] CHECK CONSTRAINT
[FK_EMPLOYEE_DEPARTMENT]
GO
ALTER TABLE [dbo].[EMPLOYEE] WITH CHECK ADD CONSTRAINT
[FK_EMPLOYEE_EMPLOYEE] FOREIGN KEY([SUPERVISOR_ID])
REFERENCES [dbo].[EMPLOYEE] ([EMP_ID])
GO
ALTER TABLE [dbo].[EMPLOYEE] CHECK CONSTRAINT [FK_EMPLOYEE_EMPLOYEE]
GO
ALTER TABLE [dbo].[EMPLOYEE] WITH CHECK ADD CONSTRAINT
[FK_EMPLOYEE_Employee_Budget] FOREIGN KEY([RATING])
REFERENCES [dbo].[Employee_Budget] ([rating])
GO
ALTER TABLE [dbo].[EMPLOYEE] CHECK CONSTRAINT
[FK_EMPLOYEE_Employee_Budget]
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description',
@value=N'Sets the budget for the employee''s rating' ,
@level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'EMPLOYEE',
@level2type=N'CONSTRAINT',@level2name=N'FK_EMPLOYEE_Employee_Budget'
GO
ALTER TABLE [dbo].[EMPLOYEE] WITH CHECK ADD CONSTRAINT
[FK_EMPLOYEE_Employee_Type] FOREIGN KEY([type])
REFERENCES [dbo].[Employee_Type] ([type_id])
GO
ALTER TABLE [dbo].[EMPLOYEE] CHECK CONSTRAINT
[FK_EMPLOYEE_Employee_Type]
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description',
@value=N'the type of employee' ,
@level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'EMPLOYEE',
@level2type=N'CONSTRAINT',@level2name=N'FK_EMPLOYEE_Employee_Type'



5. Δεδομένα υπαλλήλων (Employee_Data)

Ο πίνακας αυτός περιλαμβάνει τον κωδικό του υπαλλήλου, το οποίο
είναι το κύριο κλειδί του πίνακα και συνδέεται με μια συσχέτιση ένα προς
ένα με τον κωδικό του πίνακα Employee. Επίσης, ο πίνακας περιέχει το
όνομα του υπαλλήλου, το επώνυμό του, τη διεύθυνσή του, το τηλέφωνό του,
το φαξ του, το ειδικότητα του και το e-mail του. Παρακάτω παρατίθεται και
ο κώδικας δημιουργίας του:

40

USE [prom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Employee_Data](
[ID] [int] NOT NULL,
[NAME] [varchar](30) COLLATE Greek_CI_AS NOT NULL,
[SURNAME] [varchar](35) COLLATE Greek_CI_AS NOT NULL,
[ADDRESS] [varchar](50) COLLATE Greek_CI_AS NOT NULL,
[PHONE] [varchar](15) COLLATE Greek_CI_AS NULL,
[FAX] [varchar](15) COLLATE Greek_CI_AS NULL,
[JOB_TITLE] [varchar](50) COLLATE Greek_CI_AS NULL,
[EMAIL] [varchar](50) COLLATE Greek_CI_AS NULL,
CONSTRAINT [PK_Employee_Data] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Employee_Data] WITH CHECK ADD CONSTRAINT
[FK_Employee_Data_EMPLOYEE] FOREIGN KEY([ID])
REFERENCES [dbo].[EMPLOYEE] ([EMP_ID])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[Employee_Data] CHECK CONSTRAINT
[FK_Employee_Data_EMPLOYEE]
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description',
@value=N'The data of employee' ,
@level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'Employee_Data',
@level2type=N'CONSTRAINT',@level2name=N'FK_Employee_Data_EMPLOYEE'


6. Προϋπολογισμός Υπαλλήλου (Employee Budget)

Σε αυτόν τον πίνακα υπάρχει το rating, το οποίο είναι το κύριο κλειδί του
πίνακα και προσδιορίζει τη βαθμίδα του υπαλλήλου στην ιεραρχία της
επιχείρησης. Περιλαμβάνει το μέγιστο ποσό που μπορεί να ξοδέψει ένας
υπάλληλος σε ένα χρονικό διάστημα, όπως και το ποσό που μπορεί να
εγκρίνει, εφόσον είναι προϊστάμενος κάποιου. Ο κώδικας δημιουργίας του
πίνακα είναι:


41
USE [prom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Employee_Budget](
[rating] [tinyint] NOT NULL,
[max_budget] [real] NOT NULL,
[budget_approve] [real] NULL,
CONSTRAINT [PK_Employee_Budget] PRIMARY KEY CLUSTERED
(
[rating] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]


7. Ο Ρόλος του Υπαλλήλου (Employee_Type)

Σε αυτόν τον πίνακα υπάρχουν ο κωδικός του ρόλου του υπαλλήλου το
οποίο είναι και το κύριο κλειδί του πίνακα, καθώς και η περιγραφή του
ρόλου του. Οι ρόλοι που υπάρχουν σύμφωνα με την βάση είναι:

1. Διαχειριστής (Administrator)
2. Υπεύθυνος Παραγγελιών (Supplies_User)
3. Υπεύθυνος Προσωπικού (Personel_User)
4. Τελικός Χρήστης (End_User)

Ο καθένας από αυτούς τους χρήστες έχουν ένα συγκεκριμένο ρόλο στην
εφαρμογή. Εκτός από τον Administrator όλοι οι υπόλοιποι δεν έχουν
πρόσβαση σε όλα τα μέρη της εφαρμογής. Ο κώδικας του είναι:

USE [prom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Employee_Type](
[type_id] [tinyint] NOT NULL,
[description] [varchar](40) COLLATE Greek_CI_AS NOT NULL,
CONSTRAINT [PK_Employee_Type] PRIMARY KEY CLUSTERED
( [type_id] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF

42
8. Ο Πίνακας Login

Στον πίνακα Login περιέχονται όλοι οι χρήστες (username) και οι
κωδικοί (password) με τους οποίους μπορεί κάποιος να κάνει Login στην
εφαρμογή. Εάν κάποιος χρήστης δεν είναι καταχωρημένος σε αυτόν τον
πίνακα δεν μπορεί να εισέλθει στην εφαρμογή. Εδώ υπάρχει πάλι το κύριο
κλειδί του υπαλλήλου με συσχέτιση ένα προς ένα με τον πίνακα Employee,
αντικατροπτίζει στην ουσία κάποιο υπάλληλο, το όνομα του χρήστη και το
συνθηματικό του. Ο κώδικας δημιουργίας του πίνακα είναι:

USE [prom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[LOGIN](
[EMP_ID] [int] NOT NULL,
[USERNAME] [varchar](12) COLLATE Greek_CI_AS NOT NULL,
[PASSWORD] [varchar](32) COLLATE Greek_CI_AS NOT NULL,
CONSTRAINT [PK_LOGIN] PRIMARY KEY CLUSTERED
(
[EMP_ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY],
CONSTRAINT [UNIQ_USERNAME] UNIQUE NONCLUSTERED
(
[USERNAME] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[LOGIN] WITH CHECK ADD CONSTRAINT
[FK_LOGIN_EMPLOYEE] FOREIGN KEY([EMP_ID])
REFERENCES [dbo].[EMPLOYEE] ([EMP_ID])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[LOGIN] CHECK CONSTRAINT [FK_LOGIN_EMPLOYEE]









43
9. Ο Πίνακας με τα Logs του Login

Στον πίνακα αυτό διατηρούνται όλα τα logs, δηλαδή το πότε ένας
χρήστης συνδέθηκε και αποσυνδέθηκε από την εφαρμογή. Σε αυτόν τον
πίνακα υπάρχει ένα πεδίο που ονομάζεται session_id, το οποίο αυξάνεται
αυτόματα και είναι κύριο κλειδί της βάσης. Επίσης, υπάρχει ο κωδικός του
κάθε υπαλλήλου που επίσης είναι κύριο κλειδί της βάσης, ο χρόνος που
έκανε log in στην εφαρμογή και ο χρόνος που έκανε log out. Ο κώδικας του
πίνακα είναι ο εξής:

USE [prom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Login_Log](
[session_id] [int] IDENTITY(1,1) NOT NULL,
[emp_id] [int] NOT NULL,
[loggedin] [datetime] NOT NULL,
[loggedout] [datetime] NULL,
CONSTRAINT [PK_Login_Log] PRIMARY KEY CLUSTERED
(
[session_id] ASC,
[emp_id] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[Login_Log] WITH CHECK ADD CONSTRAINT
[FK_Login_Log_EMPLOYEE1] FOREIGN KEY([emp_id])
REFERENCES [dbo].[EMPLOYEE] ([EMP_ID])
GO
ALTER TABLE [dbo].[Login_Log] CHECK CONSTRAINT
[FK_Login_Log_EMPLOYEE1]


Επίσης, στον πίνακα υπάρχει και ένας trigger οποίος εκτελείται μόλις
ένας χρήστης κάνει log in στην εφαρμογή και μόλις εισάγεται ο κωδικός του
υπαλλήλου στον πίνακα, καλεί μια συνάρτηση η οποία παίρνει την ώρα από
τον υπολογιστή που φιλοξενεί την βάση και την τοποθετεί στο κατάλληλο
πεδίο.

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[timest]
ON [dbo].[Login_Log]
instead of insert

44
AS
declare @time as datetime
declare @emp_id as int
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
select @emp_id = (select emp_id from inserted)
select @time = (select getdate())
insert into login_log(emp_id,loggedin) values(@emp_id,@time)
-- Insert statements for trigger here

END


Όταν ο χρήστης κάνει log out από την εφαρμογή τότε η εφαρμογή
παίρνει την ώρα από τη βάση και την τοποθετεί πάλι στο αντίστοιχο πεδίο
του πίνακα.

10. Αιτήσεις (Applications)

Ο πίνακας των αιτήσεων είναι ο πιο σημαντικός πίνακας της βάσης. Εδώ
αποθηκεύονται όλες οι αιτήσεις που γίνονται από τους υπαλλήλους της
εταιρίας και είναι ο συνδετικός κρίκος μεταξύ των πινάκων, γιατί μέσω
αυτού του πίνακα μπορούμε να συλλέξουμε όλες τις απαραίτητες
πληροφορίες για όλη την διαδικασία της παραγγελίας. Σε αυτόν τον πίνακα
υπάρχει ο κωδικός αίτησης, ο οποίος είναι το κύριο κλειδί του πίνακα.
Ακόμα, υπάρχει η ποσότητα του προϊόντος, το σημείωμα που μπορεί να έχει
γράψει κάποιος υπάλληλος, ο χρόνος δημιουργίας της αίτησης και το
συνολικό κόστος αγοράς. Ως αρχικό συνολικό κόστος ανά μονάδα
επιλέγεται η μέση τιμή του προϊόντος από τις τιμές που έχουν δώσει οι
προμηθευτές, για μια προσεγγιστική χρέωση. Αργότερα θα δούμε πως
επιδρούν κάποιοι trigger πάνω στην καταχώρηση και τοποθετούν στο πεδίο
την πραγματική τιμή. Επίσης, στον πίνακα υπάρχει ο κωδικός του είδους, ο
οποίος είναι ξένο κλειδί στον πίνακα είδος και προσδιορίζει το είδος
παραγγελίας. Υπάρχει ο κωδικός του υπαλλήλου, οποίος είναι ξένο κλειδί
από τον πίνακα του υπαλλήλου και προσδιορίζει τον υπάλληλο και τέλος
έχουμε τον κωδικό κατάστασης που είναι ξένο κλειδί στον πίνακα
κατάσταση (State) και δείχνει την κατάσταση της αίτησης. Ο κώδικας
δημιουργίας του πίνακα είναι:

USE [prom]
GO
SET ANSI_NULLS ON


45
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[APPLICATION](
[APPLICATION_ID] [int] IDENTITY(1,1) NOT NULL,
[EIDOS_ID] [int] NOT NULL,
[QUANTITY] [float] NOT NULL,
[STATE] [tinyint] NULL,
[MEMO] [text] COLLATE Greek_CI_AS NULL,
[POST_TIME] [datetime] NULL,
[EMPLOYEE_ID] [int] NOT NULL CONSTRAINT
[DF_APPLICATION_EMPLOYEE_ID] DEFAULT ((-1)),
[SUM] [real] NULL,
CONSTRAINT [PK_APPLICATION] PRIMARY KEY CLUSTERED
(
[APPLICATION_ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO
ALTER TABLE [dbo].[APPLICATION] WITH CHECK ADD CONSTRAINT
[FK_APPLICATION_EIDOS] FOREIGN KEY([EIDOS_ID])
REFERENCES [dbo].[EIDOS] ([EIDOS_ID])
GO
ALTER TABLE [dbo].[APPLICATION] CHECK CONSTRAINT
[FK_APPLICATION_EIDOS]
GO
ALTER TABLE [dbo].[APPLICATION] WITH CHECK ADD CONSTRAINT
[FK_APPLICATION_EMPLOYEE] FOREIGN KEY([EMPLOYEE_ID])
REFERENCES [dbo].[EMPLOYEE] ([EMP_ID])
ON UPDATE SET DEFAULT
ON DELETE SET DEFAULT
GO
ALTER TABLE [dbo].[APPLICATION] CHECK CONSTRAINT
[FK_APPLICATION_EMPLOYEE]
GO
ALTER TABLE [dbo].[APPLICATION] WITH CHECK ADD CONSTRAINT
[FK_APPLICATION_STATES] FOREIGN KEY([STATE])
REFERENCES [dbo].[STATES] ([STATE_ID])
GO
ALTER TABLE [dbo].[APPLICATION] CHECK CONSTRAINT
[FK_APPLICATION_STATES]

Ακόμα, στον πίνακα υπάρχει ένας trigger που ονομάζεται post, ο οποίος
κατά την εισαγωγή μιας νέας αίτησης στον πίνακα, βρίσκει το ποσό στο
οποίο αντιστοιχεί η παραγγελία, το οποίο είναι η μέση τιμή του προϊόντος
από τους προμηθευτές, βρίσκει το διαθέσιμο ποσό του υπαλλήλου, όπως και
τον κωδικό του υπαλλήλου. Τέλος παίρνει τον αριθμό της αίτησης και
καταχωρεί την ημερομηνία δημιουργίας της στο κατάλληλο πεδίο. Εφόσον,
έχει γίνει η αίτηση και έχει μαζέψει τα στοιχεία που χρειάζεται, πηγαίνει
στον πίνακα approves και αυτο-εγκρίνει την αίτησή του. Έπειτα γίνεται ο
έλεγχος για να διαπιστωθεί αν μπορεί η αίτηση να προχωρήσει κατευθείαν ή

46
αν πρέπει να εγκριθεί από τους ανώτερους του. Εάν το ποσό της αίτησης
είναι μεγαλύτερο από το ποσό που μπορεί να ξοδέψει ο υπάλληλος, τότε ο
trigger βρίσκει τον προϊστάμενο του υπαλλήλου και δημιουργεί μια νέα
καταχώρηση στον πίνακα approves με τον κωδικό του προϊσταμένου, χωρίς
να τοποθετήσει ημερομηνία έγκρισης. Οι λειτουργίες στον πίνακα approves
αναλύονται παρακάτω. Εάν τώρα τα ποσό της αίτησης είναι μικρότερο από
το ποσό που μπορεί να ξοδέψει ο υπάλληλος, τότε αφαιρείται προσωρινά το
ποσό της παραγγελίας από το λογαριασμό του χρήστη, επειδή είναι η μέση
τιμή του προϊόντος και όχι η πραγματική τιμή της παραγγελίας η οποία θα
αλλάξει αργότερα κατά τη δημιουργία της παραγγελίας. Τέλος, ο trigger
αλλάζει το πεδίο του πίνακα που αναφέρεται στην κατάσταση της αίτησης.
Από μηδέν (0) που είναι η αρχική κατάσταση της αίτησης γίνεται ένα (1). Οι
τιμές των καταστάσεων περιγράφονται στον πίνακα states. Εφόσον, τώρα η
κατάσταση της αίτησης είναι 1 γίνεται η παραγγελία. Παρακάτω ο trigger :

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[post]
ON [dbo].[APPLICATION]
FOR INSERT
AS

declare @ptime as datetime
declare @app_id as int
declare @sums as real
declare @super_id as int
declare @emp_money as real
declare @emp_id as int

BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

SELECT @SUMS = (SELECT SUM FROM INSERTED) --mesi timi paragelias
select @emp_money = (select remaining_money from employee
E,INSERTED I where E.emp_ID=I.EMPLOYEE_ID)--poso pou periseuei
select @emp_id = (select employee_id from inserted)

SELECT @app_id = (SELECT APPLICATION_ID FROM INSERTED)

update APPLICATION set [POST_TIME] = getdate() where
APPLICATION_ID = @app_id --eisagwgi imerominias aitisis
insert into approves values(@emp_id,@app_id,getdate(),1) -- o
employee arxika egkrinei thn aithsh tou
if(@sums>@emp_money)
-- to poso ths aithshs einai megalytero apo to ypoloipo tou employee
-- opote to trigger vriskei ton epomeno pou prepei na egkrinei thn
aithsh

47
-- kai dimiourgei mia nea kataxwrish sto approves me ton kwdiko tou
proistamenou
-- xwris na valei imerominia egkrisis ( o proistamenos tha kanei update
se afthn thn kataxwrisi an thn egkrinei)
begin
select @super_id = (select SUPER.EMP_ID AS SUPER_ID from
application A,EMPLOYEE EMP,EMPLOYEE SUPER where
A.APPLICATION_ID =@app_id and
EMP.EMP_ID = A.EMPLOYEE_ID and
EMP.SUPERVISOR_ID = SUPER.EMP_ID)
print str(@super_id);
insert into
APPROVES([EMPLOEE_APPROVES_ID],[APPLICATION_ID],[APPROVAL])
values(@super_id,@app_id,0)

end
else
begin
print('sums=<money');
UPDATE [PROM].[dbo].[EMPLOYEE]
SET [remaining_money] = [remaining_money]- @SUMS --afairesi tou posu
apo ta xrimata tou
WHERE [EMPLOYEE].EMP_ID = @emp_id;
update APPLICATION SET [STATE] = 1 where application_id =
@app_id
end
-- Insert statements for trigger here

END


11. Εγκρίσεις (Approves)

Στον πίνακα των εγκρίσεων φαίνονται ποιοι έχουν εγκρίνει τις αιτήσεις.
Μια αίτηση θα εγκρίνεται αυτόματα όπως περιγράψαμε λίγο παραπάνω ή θα
πρέπει να εγκριθεί και από τον ή τους προϊσταμένους του υπαλλήλου ώστε
να γίνει παραγγελία. Ο πίνακας των εγκρίσεων αποτελείται από το πεδίο
employee_approves_id το οποίο είναι κύριο κλειδί του πίνακα αλλά και
ξένο κλειδί από τον πίνακα employee, ώστε οι τιμές που παίρνει να ανήκουν
στον πίνακα employee. Επίσης, υπάρχει το πεδίο application_id το οποίο
είναι και αυτό κύριο κλειδί του πίνακα, αλλά και ξένο κλειδί από τον πίνακα
applications. Ο λόγος που έχουμε δυο κύρια κλειδιά είναι το ότι μια
εγγραφή χρησιμοποιείται περισσότερες από μια φορές. Ακόμα, υπάρχει το
πεδίο approval_time το οποίο δέχεται την ώρα και την ημερομηνία
έγκρισης, και το πεδίο approval το οποίο δέχεται τρεις καταστάσεις :
• 0 Δεν έχει πάρει κατάσταση ακόμα
• 1 Έχει εγκριθεί
• 2 Έχει απορριφθεί

48
Ο κώδικας δημιουργίας του πίνακα είναι ο ακόλουθος:

USE [prom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[APPROVES](
[EMPLOEE_APPROVES_ID] [int] NOT NULL,
[APPLICATION_ID] [int] NOT NULL,
[APPROVAL_TIME] [datetime] NULL,
[approval] [smallint] NULL,
CONSTRAINT [PK_APPROVES] PRIMARY KEY CLUSTERED
(
[EMPLOEE_APPROVES_ID] ASC,
[APPLICATION_ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[APPROVES] WITH CHECK ADD CONSTRAINT
[FK_APPROVES_APPLICATION] FOREIGN KEY([APPLICATION_ID])
REFERENCES [dbo].[APPLICATION] ([APPLICATION_ID])
GO
ALTER TABLE [dbo].[APPROVES] CHECK CONSTRAINT [FK_APPROVES_APPLICATION]
GO
ALTER TABLE [dbo].[APPROVES] WITH CHECK ADD CONSTRAINT
[FK_APPROVES_EMPLOYEE] FOREIGN KEY([EMPLOEE_APPROVES_ID])
REFERENCES [dbo].[EMPLOYEE] ([EMP_ID])
GO
ALTER TABLE [dbo].[APPROVES] CHECK CONSTRAINT [FK_APPROVES_EMPLOYEE]


Στον πίνακα approves υπάρχει ένας trigger οποίος ονομάζεται
find_next_supervisor, ο οποίος κατά την ανανέωση μιας εγγραφής στον
πίνακα από τον προϊστάμενο του υπαλλήλου, παίρνει την τιμή από το
approval (0 ή 1), την τιμή του application_id και την τιμή employee_id.
Έπειτα γίνεται ένας έλεγχος ο οποίος ελέγχει αν το approval είναι ένα, τότε :
Δίνει σε μια μεταβλητή το συνολικό ποσό της αίτησης που έκανε ο
συγκεκριμένος υπάλληλος, έπειτα παίρνει το ποσό που μπορεί να εγκρίνει ο
προϊστάμενος του. Εάν το ποσό της αίτησης είναι μεγαλύτερο από το ποσό
το οποίο μπορεί να εγκρίνει τότε βρίσκει τον κωδικό του δικού του
προϊσταμένου και εισάγει στον πίνακα approves μια καινούργια εγγραφή με
τον κωδικό του προϊσταμένου που βρήκε, τον κωδικό της αίτησης και
τοποθετεί στο πεδίο approval την τιμή μηδέν (0) ώστε και αυτός να την
ελέγξει και να αποφασίσει αν θα εγκριθεί ή όχι. Εάν την απορρίψει τότε
αλλάζει η κατάσταση της αίτησης σε δύο (2). Αν μπορεί τότε αλλάζει την

49
κατάσταση της αίτησης σε ένα, ενώ αν το ποσό έγκρισης είναι μικρότερο
από το ποσό παραγγελίας, το προωθεί στον προϊστάμενο του για να
αποφασίσει εκείνος. Ο κώδικας του trigger είναι ο ακόλουθος :

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[find_next_supervisor]
ON [dbo].[APPROVES]
AFTER UPDATE
AS
declare @emp_id as int
declare @sup_id as int
declare @sums as real
declare @appr as int
declare @app_id as int
declare @budget_ap as real

BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
select @appr= (select approval from inserted)

SELECT @app_id= (select APPLICATION_ID FROM INSERTED)
select @emp_id= (select EMPLOEE_APPROVES_ID from INSERTED)
if(@appr=1)
begin

SELECT @SUMS = (SELECT A.[SUM] FROM [application]
A,approves AP
where A.APPLICATION_ID = AP.APPLICATION_ID and
AP.APPLICATION_ID = @app_id
and AP.emploee_approves_id = @emp_id)

select @budget_ap = (select budget_approve from
Employee_Budget B,employee E
where E.rating = B.rating and E.emp_id = @emp_id)

if(@sums>@budget_ap) --xreiazetai nea egkrisi?
begin
-- vriskei ton epomeno gia na egrinei tin aitisi

select @sup_id = (select SUPERVISOR_ID from approves APP, EMPLOYEE E
where APP.emploee_approves_id = E.emp_id
and APP.emploee_approves_id =@emp_id
AND APP.APPLICATION_ID =@app_id )

insert into APPROVES([EMPLOEE_APPROVES_ID],[APPLICATION_ID],[approval])
values(@sup_id,@app_id,0)
end
else
begin

update [APPLICATION] SET [STATE] = 1 where application_id = @app_id

50

end

end
else
begin
update [APPLICATION] SET [STATE] = 2 where application_id = @app_id
end

END


12. Παραγγελίες (Orders)

Στον πίνακα αυτό καταγράφονται οι αιτήσεις οι οποίες έχουν εγκριθεί
από τις προηγούμενες διαδικασίες και γίνονται παραγγελίες. Ο πίνακας
αυτός περιλαμβάνει το order_id το οποίο είναι το κύριο κλειδί του πίνακα
και αποθηκεύει το κωδικό της παραγγελίας. Ένα άλλο πεδίο είναι το
application_id το οποίο είναι ξένο κλειδί στον πίνακα των αιτήσεων και
δείχνει ποια αίτηση αντιστοιχεί στην κάθε παραγγελία, άρα βλέποντας την
παραγγελία γνωρίζουμε και όλα τα στοιχεία της αίτησης. Έχουμε ακόμα το
supplier_id το οποιο αντιστοιχεί στο κωδικό του προμηθευτή από τον οποίο
θα παραγγείλουμε το προϊόν και το πεδιο αυτό είναι ξένο κλειδί στον πίνακα
των προμηθευτών.

Ακόμα, υπάρχουν τα πεδία time_created και
time_finished τα οποία δείχνουν την ημερομηνία για το πότε μια παραγγελία
ξεκίνησε και πότε ολοκληρώθηκε. Τέλος, υπάρχει και το πεδίο του
employee_ypefthinos το οποιο είναι ξένο κλειδί στον πίνακα employee και
δείχνει ποιος υπάλληλος είναι υπεύθυνος για την πραγματοποίηση της
παραγγελίας. Ο κώδικας δημιουργίας αυτού του πίνακα είναι :


USE [prom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ORDERS](
[ORDER_ID] [int] IDENTITY(1,1) NOT NULL,
[APPLICATION_ID] [int] NOT NULL,
[SUPPLIER_ID] [int] NOT NULL,
[TIME_CREATED] [datetime] NULL,
[TIME_FINISHED] [datetime] NULL,
[EMPLOYEE_YPEFTHINOS_ID] [int] NOT NULL,

CONSTRAINT [PK_ORDERS] PRIMARY KEY CLUSTERED
(

51
[ORDER_ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[ORDERS] WITH CHECK ADD CONSTRAINT
[FK_ORDERS_APPLICATION] FOREIGN KEY([APPLICATION_ID])
REFERENCES [dbo].[APPLICATION] ([APPLICATION_ID])
GO
ALTER TABLE [dbo].[ORDERS] CHECK CONSTRAINT [FK_ORDERS_APPLICATION]
GO
ALTER TABLE [dbo].[ORDERS] WITH CHECK ADD CONSTRAINT
[FK_ORDERS_EMPLOYEE] FOREIGN KEY([EMPLOYEE_YPEFTHINOS_ID])
REFERENCES [dbo].[EMPLOYEE] ([EMP_ID])
GO
ALTER TABLE [dbo].[ORDERS] CHECK CONSTRAINT [FK_ORDERS_EMPLOYEE]
GO
ALTER TABLE [dbo].[ORDERS] WITH CHECK ADD CONSTRAINT
[FK_ORDERS_SUPPLIER] FOREIGN KEY([SUPPLIER_ID])
REFERENCES [dbo].[SUPPLIER] ([SUPPLIER_ID])
GO
ALTER TABLE [dbo].[ORDERS] CHECK CONSTRAINT [FK_ORDERS_SUPPLIER]

Στον πίνακα των παραγγελιών υπάρχει ένας trigger που ονομάζεται
new_order. Ο trigger αυτός επενεργεί μετά την εισαγωγή μιας καταχώρησης
στον πίνακα των παραγγελιών, όπου πρώτα δίνει σε μια μεταβλητή τον
κωδικό της αίτησης που έγινε παραγγελία, έπειτα ενημερώνει το πεδίο state
του πίνακα application και τοποθετεί την τιμή τρία (3). Μετά κάνει τον
υπολογισμό της τελικής
τιμής του προϊόντος από έναν συγκεκριμένο
προμηθευτή. Έπειτα, βρίσκει αν αυτή η αίτηση έχει εγκριθεί από τον
υπάλληλο που την έκανε, βάσει του ποσού που δικαιούται να ξοδέψει, ή έχει
εγκριθεί και από άλλους πέραν αυτού. Εάν ισχύει το πρώτο σκέλος, τότε
στον πίνακα employee προσθέτει στο πεδιο remaining_money τα χρήματα
που υπάρχουν στο πεδιο sum του πίνακα application, από την αίτηση που
έγινε παραγγελία. Αυτό το ποσό στο πεδίο sum του πίνακα application ήταν
η μέση τιμή του προϊόντος και όχι η πραγματική τιμή αγοράς του. Έπειτα,
αφαιρεί από το πεδιο remaining_money του πίνακα employee την τελική
τιμή που βρήκε παραπάνω, η οποία είναι και η ακριβής τιμή της
παραγγελίας. Τέλος, πηγαίνει στον πίνακα application και τοποθετεί στο
πεδίο sum την τελική τιμή και αφαιρεί επίσης από το ποσό πίστωσης του
προμηθευτή την τελική τιμή. Τώρα εάν η αίτηση έχει εγκριθεί και από
άλλους υπαλλήλους, ο trigger δεν κάνει τίποτα, όσο για τα ποσά αυτά θα
φαίνονται στις αναφορές του καταστήματος από το μενού των αναφορών. Ο
κώδικας του trigger είναι :



52
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[new_order]
ON [dbo].[ORDERS]
after INSERT
AS
declare @appid as int
declare @teliki_price as decimal
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
select @appid = (SELECT APPLICATION_ID FROM INSERTED)
SET NOCOUNT ON;

UPDATE [PROM].[dbo].[APPLICATION]
SET [STATE] = 3
WHERE APPLICATION_ID = @appid
-- Insert statements for trigger here



select @teliki_price = (select price*Quantity as Last_Price
from orders O,application A,Supplies S
where O.application_id = A.application_id
and S.supplier_id = O.supplier_id
and S.eidos_id = A.eidos_id
and O.application_id =@appid )

if ((select COUNT(*) from approves where application_id = @appid)=1)
begin

UPDATE [PROM].[dbo].[EMPLOYEE]
SET [remaining_money] = [remaining_money]+ (select SUM
from [application] where [APPLICATION_ID] = @appid)
WHERE [EMPLOYEE].EMP_ID = (select EMPLOYEE_ID from [application]
where [APPLICATION_ID] = @appid)

UPDATE [PROM].[dbo].[EMPLOYEE]
SET [remaining_money] = [remaining_money] -@teliki_price
WHERE emp_id = (select employee_id from application where
application_id = @appid)
end

UPDATE [PROM].[dbo].[APPLICATION]
SET [SUM] = @teliki_price
WHERE application_id=@appid


UPDATE [PROM].[dbo].[SUPPLIER]
SET [REMAINING_BUDGET] = [REMAINING_BUDGET] - @teliki_price
WHERE supplier_id = (select S.supplier_id from supplier S,orders O
where S.supplier_id= O.supplier_id
and O.application_id = @appid)

END

53

13. Προμηθευτές (Suppliers)

Ο πίνακας των προμηθευτών περιέχει τα στοιχεία που χαρακτηρίζουν τον
κάθε προμηθευτή. Το κύριο κλειδί στον πίνακα είναι το supplier_id, δηλαδή
ο κωδικός του. Στον πίνακα αναφέρονται η επωνυμία του προμηθευτή, το
ΑΦΜ του, η διεύθυνση εργασίας του, το τηλέφωνο, το fax του και το e-mail
του. Ακόμα, υπάρχει το όνομα του υπευθύνου του καταστήματος, το ποσό
πίστωσης που μπορεί να κάνει ο προμηθευτής στον οργανισμό
(max_budget), όπως και το εναπομένον ποσό πίστωσης (remaining_budget).
Τέλος, υπάρχει ο κωδικός της πόλης στην οποία βρίσκεται ο προμηθευτής
και είναι ξενο κλειδί από τον πίνακα city. Ο κώδικας δημιουργίας του
πίνακα είναι :

USE [prom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[SUPPLIER](
[SUPPLIER_ID] [int] IDENTITY(1,1) NOT NULL,
[EPONYMIA] [varchar](30) COLLATE Greek_CI_AS NOT NULL,
[AFM] [varchar](12) COLLATE Greek_CI_AS NOT NULL,
[ADDRESS] [varchar](30) COLLATE Greek_CI_AS NOT NULL,
[PHONE] [varchar](15) COLLATE Greek_CI_AS NOT NULL,
[FAX] [varchar](15) COLLATE Greek_CI_AS NULL,
[EMAIL] [varchar](30) COLLATE Greek_CI_AS NULL,
[CITY_ID] [int] NOT NULL,
[YPEFTHINOS_NAME] [varchar](30) COLLATE Greek_CI_AS NULL,
[MAX_BUDGET] [real] NOT NULL,
[REMAINING_BUDGET] [real] NOT NULL,
CONSTRAINT [PK_SUPPLIER] PRIMARY KEY CLUSTERED
(
[SUPPLIER_ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY],
CONSTRAINT [AFM_UNIQUE] UNIQUE NONCLUSTERED
(
[AFM] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[SUPPLIER] WITH CHECK ADD CONSTRAINT
[FK_SUPPLIER_CITY] FOREIGN KEY([CITY_ID])
REFERENCES [dbo].[CITY] ([CITY_ID])

54
GO
ALTER TABLE [dbo].[SUPPLIER] CHECK CONSTRAINT [FK_SUPPLIER_CITY]


14. Κατηγορία Είδους (katigoria_eidous)

Η κατηγορία είδους είναι ένας πίνακας στον οποιο υπάρχουν οι
κατηγορίες των ειδών που προμηθεύεται ο οργανισμός. Το κύριο κλειδί του
πίνακα είναι το kathgoria_id, ακόμα υπάρχει το όνομα της κατηγορίας των
προϊόντων και η περιγραφή της κατηγορίας. Ο κώδικας δημιουργίας του
πίνακα είναι :

USE [prom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[KATHGORIA_EIDOUS](
[KATHGORIA_ID] [int] IDENTITY(1,1) NOT NULL,
[NAME] [varchar](20) COLLATE Greek_CI_AS NOT NULL,
[DESCRIPTION] [varchar](40) COLLATE Greek_CI_AS NULL,
CONSTRAINT [PK_KATHGORIA_EIDOUS] PRIMARY KEY CLUSTERED
(
[KATHGORIA_ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF


15. Είδος (Eidos)

Στον πίνακα είδος γίνεται η καταχώρηση των ειδών που προμηθεύεται ο
οργανισμός από τους προμηθευτές του. Στον πίνακα υπάρχει το adios_id το
οποιο είναι το κύριο κλειδί του πίνακα και προσδιορίζει το κάθε είδος που
προμηθεύεται. Ακόμα, υπάρχει το short_description που αποτελεί την
ονομασία του προϊόντος, αλλά και το full_description που είναι μια
περιγραφή του προϊόντος. Υπάρχει το πεδίο count_unit που αποτελεί την
μονάδα μέτρησης του προϊόντος, το suggested_price που είναι το πεδίο στο
οποιο κρατείται η μέση τιμή του προϊόντος από τους προμηθευτές. Τέλος,
υπάρχει το kathgoria_id το οποιο είναι ξένο κλειδί από την κατηγορία είδους

55
και προσδιορίζει σε ποια κατηγορία βρίσκεται το προϊόν. Ο κώδικας
δημιουργίας του πίνακα είναι :

USE [prom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[EIDOS](
[EIDOS_ID] [int] IDENTITY(1,1) NOT NULL,
[SHORT_DESCRIPTION] [varchar](30) COLLATE Greek_CI_AS NOT NULL,
[COUNT_UNIT] [varchar](15) COLLATE Greek_CI_AS NULL,
[FULL_DESCRIPTION] [text] COLLATE Greek_CI_AS NULL,
[KATHGORIA_ID] [int] NOT NULL,
[SUGESTED_PRICE] [real] NULL,
CONSTRAINT [PK_EIDOS] PRIMARY KEY CLUSTERED
(
[EIDOS_ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[EIDOS] WITH CHECK ADD CONSTRAINT
[FK_EIDOS_KATHGORIA_EIDOUS] FOREIGN KEY([KATHGORIA_ID])
REFERENCES [dbo].[KATHGORIA_EIDOUS] ([KATHGORIA_ID])
GO
ALTER TABLE [dbo].[EIDOS] CHECK CONSTRAINT [FK_EIDOS_KATHGORIA_EIDOUS]




16. Προϊόντα που προμηθεύει ο προμηθευτής (Supplies)

Στον πίνακα αυτόν αναγράφεται το ποιος προμηθευτής προμηθεύει ποιο
είδος και σε ποια τιμή. Ο πίνακας περιέχει τα παρακάτω πεδία τα οποία
είναι το supplier_id το οποιο είναι κύριο κλειδί του πίνακα και ξένο κλειδί
από τον πίνακα των προμηθευτών, το eidos_id είναι και αυτό κύριο κλειδί
του πίνακα και ξένο κλειδί από τον πίνακα των ειδών. Ακόμα, υπάρχουν το
πεδίο price το οποιο αναφέρει την τιμή που προμηθεύει ένας προμηθευτής
ένα είδος και το last_updated το οποίο μας δίνει την ημερομηνία ανανέωσης
ή προσθήκης του είδους. Ο κώδικας δημιουργίας του πίνακα είναι:



56
USE [prom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[SUPPLIES](
[SUPPLIER_ID] [int] NOT NULL,
[EIDOS_ID] [int] NOT NULL,
[PRICE] [real] NOT NULL,
[LAST_UPDATED] [datetime] NULL,
CONSTRAINT [PK_SUPPLIES] PRIMARY KEY CLUSTERED
(
[SUPPLIER_ID] ASC,
[EIDOS_ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[SUPPLIES] WITH CHECK ADD CONSTRAINT
[FK_SUPPLIES_EIDOS] FOREIGN KEY([EIDOS_ID])
REFERENCES [dbo].[EIDOS] ([EIDOS_ID])
GO
ALTER TABLE [dbo].[SUPPLIES] CHECK CONSTRAINT [FK_SUPPLIES_EIDOS]
GO
ALTER TABLE [dbo].[SUPPLIES] WITH CHECK ADD CONSTRAINT
[FK_SUPPLIES_SUPPLIER] FOREIGN KEY([SUPPLIER_ID])
REFERENCES [dbo].[SUPPLIER] ([SUPPLIER_ID])
GO
ALTER TABLE [dbo].[SUPPLIES] CHECK CONSTRAINT [FK_SUPPLIES_SUPPLIER]

Ο πίνακας έχει τρεις trigger. Ο πρώτος αφορά στην διαγραφή κάποιας
καταχώρησης από τον πίνακα προμηθεύει. Βρίσκει το είδος το οποίο
διαγράφηκε από τον πίνακα και υπολογίζει τη νέα μέση τιμή την οποία την
τοποθετεί στο αντίστοιχο πεδίο του πίνακα είδους. Ο κώδικας για αυτό
είναι:


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[delete_item_suggested_price]
ON [dbo].[SUPPLIES]
AFTER DELETE
AS
declare @eidos as int
declare @mean_price as real
BEGIN

SET NOCOUNT ON;
SELECT @eidos = (SELECT EIDOS_ID FROM DELETED)
select @mean_price = (select avg(price) as mean_price from
supplies where EIDOS_ID = @eidos)

57

UPDATE [dbo].[EIDOS]
SET [SUGESTED_PRICE] = @mean_price
where [dbo].[EIDOS].EIDOS_ID = @eidos

END

Ο δεύτερος αφορά στην εισαγωγή κάποιας καταχώρησης στον πίνακα.
Βρίσκει το είδος το οποιο καταχωρήθηκε στον πίνακα και υπολογίζει την
καινούργια μέση τιμή την οποία την τοποθετεί στο αντίστοιχο πεδίο του