Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung Nächste Überarbeitung Beide Seiten der Revision | ||
se:datenbankentwicklung [2008-09-14 16:52] stefan |
se:datenbankentwicklung [2008-09-14 18:24] stefan |
||
---|---|---|---|
Zeile 20: | Zeile 20: | ||
* Data Buffer Cache: Abgefragte oder modifizierte Daten, vermeidet physikalischen Zugriff auf Dateien, zuletzt bearbeitete Blöcke | * Data Buffer Cache: Abgefragte oder modifizierte Daten, vermeidet physikalischen Zugriff auf Dateien, zuletzt bearbeitete Blöcke | ||
* Redo Log Buffer: Redo-Informationen werden zwischengespeichert bis sie physikalisch geschrieben werden | * Redo Log Buffer: Redo-Informationen werden zwischengespeichert bis sie physikalisch geschrieben werden | ||
- | * Dictionary Cache: Data Dictionary Informationen | + | * Dictionary Cache: Data Dictionary Informationen |
* Shared SQL Pool: Benutzerübergreifende Informationen (übersetzte SQL-Statements, Tabellenbeschreibungen, Stored Procedures) | * Shared SQL Pool: Benutzerübergreifende Informationen (übersetzte SQL-Statements, Tabellenbeschreibungen, Stored Procedures) | ||
* Large Pool: Optionaler Bereich zum Puffern von größeren I/O-Operationen | * Large Pool: Optionaler Bereich zum Puffern von größeren I/O-Operationen | ||
Zeile 26: | Zeile 26: | ||
* Mögliche Fehler: ''unable to allocate shared memory, no free buffers in buffer pool'' | * Mögliche Fehler: ''unable to allocate shared memory, no free buffers in buffer pool'' | ||
* Prozesskommunikation über Speicherbereiche | * Prozesskommunikation über Speicherbereiche | ||
- | * speichert permanente Verwaltungsinformationen | + | * speichert permanente Verwaltungsinformationen |
* Program Global Area: Speicher für jede Session (Prozess) individuell | * Program Global Area: Speicher für jede Session (Prozess) individuell | ||
* Größe wird bei Installation gesetzt: PGA-Aggregat-Größe kann angepasst werden, individuelle PGA-Größen werden automatisch angepasst | * Größe wird bei Installation gesetzt: PGA-Aggregat-Größe kann angepasst werden, individuelle PGA-Größen werden automatisch angepasst | ||
Zeile 36: | Zeile 36: | ||
* **Logische Strukturen** sind nur der DB bekannt | * **Logische Strukturen** sind nur der DB bekannt | ||
* **Physikalische Strukturen** sind die Dateien auf der Festplatte | * **Physikalische Strukturen** sind die Dateien auf der Festplatte | ||
- | * **Recovery-bezogene Strukturen** (z.B. Redo-Logs und Backups) dienen der Wiederherstellung des Systems (z.B. nach Betriebssystemausfällen), werden in der Flash Recovery Area abgelegt | + | * **Recovery-bezogene Strukturen** (z.B. Redo-Logs und Backups) dienen der Wiederherstellung des Systems (z.B. nach Betriebssystemausfällen), werden in der Flash Recovery Area abgelegt |
* Tablespaces | * Tablespaces | ||
* System- und Nutzdaten liegen im permanenten Tablespace | * System- und Nutzdaten liegen im permanenten Tablespace | ||
- | * SYS hat SYSTEM als permanenten Tablespace, alle übrigen Benutzer USERS | + | * SYS hat SYSTEM als permanenten Tablespace, alle übrigen Benutzer USERS |
* SYSTEM | * SYSTEM | ||
* Data Dictionary, Tabellen mit administrativen Informationen über die DB (in Schema SYS) | * Data Dictionary, Tabellen mit administrativen Informationen über die DB (in Schema SYS) | ||
Zeile 85: | Zeile 85: | ||
* Sind einem User zugeordnet | * Sind einem User zugeordnet | ||
* Datenbankobjekt = Schemaobjekt | * Datenbankobjekt = Schemaobjekt | ||
- | * Privilegien: System-/Objekt-Privilegien | + | * Privilegien: System-/Objekt-Privilegien |
* Rollen: CONNECT (verbinden und abfragen), RESOURCE (Objekte erzeugen), DBA (alles außer STARTUP und SHUTDOWN) | * Rollen: CONNECT (verbinden und abfragen), RESOURCE (Objekte erzeugen), DBA (alles außer STARTUP und SHUTDOWN) | ||
* Benutzer: interne (z.B. SYS, SYSTEM) und Datenbankbenutzer | * Benutzer: interne (z.B. SYS, SYSTEM) und Datenbankbenutzer | ||
Zeile 97: | Zeile 97: | ||
* SQL*Loader | * SQL*Loader | ||
* Methoden: conventional, direct, external tables | * Methoden: conventional, direct, external tables | ||
- | * ''sqlldr hr/hr DATA=dependents.dat CONTROL=dependents.ctl LOG=dependents.log'' | + | * ''sqlldr hr/hr DATA=dependents.dat CONTROL=dependents.ctl LOG=dependents.log'' |
* Dump | * Dump | ||
* ''sqlplus SYSTEM/password'' | * ''sqlplus SYSTEM/password'' | ||
Zeile 104: | Zeile 104: | ||
* ''ALTER USER hrdev IDENTIFIED BY hrdev;'' | * ''ALTER USER hrdev IDENTIFIED BY hrdev;'' | ||
* ''expdp SYSTEM/password SCHEMAS=hr DIRECTORY=dmpdir DUMPFILE=schema.dmp LOGFILE=expschema.log'' | * ''expdp SYSTEM/password SCHEMAS=hr DIRECTORY=dmpdir DUMPFILE=schema.dmp LOGFILE=expschema.log'' | ||
- | * ''impdp SYSTEM/password SCHEMAS=hr DIRECTORY=dmpdir DUMPFILE=schema.dmp REMAP_SCHEMA=hr:hrdev EXCLUDE=constraint, ref_constraint, index TABLE_EXISTS_ACTION=replace LOGFILE=impschema.log'' | + | * ''impdp SYSTEM/password SCHEMAS=hr DIRECTORY=dmpdir DUMPFILE=schema.dmp REMAP_SCHEMA=hr:hrdev EXCLUDE=constraint, ref_constraint, index TABLE_EXISTS_ACTION=replace LOGFILE=impschema.log'' |
* Backup und Recovery | * Backup und Recovery | ||
* Schützen aller DB-Dateien (Daten, Control, SPFILE, REDO LOG) | * Schützen aller DB-Dateien (Daten, Control, SPFILE, REDO LOG) | ||
* Sicherung der gesamten Datenbank in der Flash Recovery Area | * Sicherung der gesamten Datenbank in der Flash Recovery Area | ||
- | * Recovery Manager (RMAN) bedienbar über Kommandozeile/Script | + | * Recovery Manager (RMAN) bedienbar über Kommandozeile/Script |
* Backup Retention Policy: Zwei vollständige Backups müssen vorgehalten werden, ARCHIVELOG: zusätzlich alle Logs für media recovery | * Backup Retention Policy: Zwei vollständige Backups müssen vorgehalten werden, ARCHIVELOG: zusätzlich alle Logs für media recovery | ||
* ARCHIVELOG schützt gegen Fehler des BS, der Oracle Instanz und der Media Disk | * ARCHIVELOG schützt gegen Fehler des BS, der Oracle Instanz und der Media Disk | ||
Zeile 117: | Zeile 117: | ||
* STARTUP MOUNT | * STARTUP MOUNT | ||
* ALTER DATABASE [NO]ARCHIVELOG; | * ALTER DATABASE [NO]ARCHIVELOG; | ||
- | * ALTER DATABASE OPEN; | + | * ALTER DATABASE OPEN; |
* Flashback Queries (Anzeige historischer Daten) | * Flashback Queries (Anzeige historischer Daten) | ||
* ''SELECT * FROM employees AS OF TIMESTAMP TO_TIMESTAMP('2005-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS') WHERE last_name = 'Chung';'' | * ''SELECT * FROM employees AS OF TIMESTAMP TO_TIMESTAMP('2005-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS') WHERE last_name = 'Chung';'' | ||
Zeile 140: | Zeile 140: | ||
* ''DROP TABLESPACE TA [INCLUDING CONTENTS];'' | * ''DROP TABLESPACE TA [INCLUDING CONTENTS];'' | ||
* Modi: Online/Offline: ''ALTER TABLESPACE TA [ONLINE | OFFLINE] [NORMAL | TEMPORARY | IMMEDIATE];'' | * Modi: Online/Offline: ''ALTER TABLESPACE TA [ONLINE | OFFLINE] [NORMAL | TEMPORARY | IMMEDIATE];'' | ||
- | * {{:se:tablespacemodi.jpg|}} | + | * {{:se:tablespacemodi.jpg|}} |
* Datenbankobjekte/Segmente: Tabellen, Indizes, Recovery-Informationen | * Datenbankobjekte/Segmente: Tabellen, Indizes, Recovery-Informationen | ||
* Tablespaces sind in Segmente (Daten, Index, Rollback, temporär) unterteilt | * Tablespaces sind in Segmente (Daten, Index, Rollback, temporär) unterteilt | ||
Zeile 146: | Zeile 146: | ||
* Problem: Fragmentierung | * Problem: Fragmentierung | ||
* Segmente bestehen aus Extents (unteschiedlicher Größe) | * Segmente bestehen aus Extents (unteschiedlicher Größe) | ||
- | * Anfangs-/Folge-Extent | + | * Anfangs-/Folge-Extent |
* Die Festlegung der Anfangs-Extent-Größe erfolgt über den Parameter initial | * Die Festlegung der Anfangs-Extent-Größe erfolgt über den Parameter initial | ||
* Die Anzahl der bei der Erstellung eines Segments mit angelegten Folge-Extents wird mit dem Parameter minextents definiert. | * Die Anzahl der bei der Erstellung eines Segments mit angelegten Folge-Extents wird mit dem Parameter minextents definiert. | ||
Zeile 154: | Zeile 154: | ||
* ''TRUNC TABLE'' bewirkt Zurücksetzen des belegten Speichers (<> ''DELETE FROM TABLE'') | * ''TRUNC TABLE'' bewirkt Zurücksetzen des belegten Speichers (<> ''DELETE FROM TABLE'') | ||
* Festlegung der Parameter bei Erstellung des Tablespaces oder der DB-Objekte | * Festlegung der Parameter bei Erstellung des Tablespaces oder der DB-Objekte | ||
- | * {{:se:storageclause.jpg|}} | + | * {{:se:storageclause.jpg|}} |
* Extents bestehen aus Oracle-Datenblöcken (2KB) | * Extents bestehen aus Oracle-Datenblöcken (2KB) | ||
* Block-Kopf | * Block-Kopf | ||
Zeile 161: | Zeile 161: | ||
* Transaktionsdirectory (23 Byte pro Eintrag) | * Transaktionsdirectory (23 Byte pro Eintrag) | ||
* initrans (1 (default) - 255) | * initrans (1 (default) - 255) | ||
- | * maxtrans | + | * maxtrans |
* Block-Datenbereich | * Block-Datenbereich | ||
* Freibereich (Speicher für sich vergrößernde Datensätze) | * Freibereich (Speicher für sich vergrößernde Datensätze) | ||
Zeile 185: | Zeile 185: | ||
* Rumpf (Daten) | * Rumpf (Daten) | ||
* Spaltenlänge: 1 Byte (NUMBER, CHAR, DATE), 3 Byte (VARCHAR, VARCHAR2, LONG, RAW, LONG RAW) | * Spaltenlänge: 1 Byte (NUMBER, CHAR, DATE), 3 Byte (VARCHAR, VARCHAR2, LONG, RAW, LONG RAW) | ||
- | * Spaltendaten | + | * Spaltendaten |
* Dictionary Views: DBA_FREE_SPACE, USER_TABLESPACES, USER_SEGMENTS, USER_EXTENTS, USER_TABLES, USER_TS_QUOTAS | * Dictionary Views: DBA_FREE_SPACE, USER_TABLESPACES, USER_SEGMENTS, USER_EXTENTS, USER_TABLES, USER_TS_QUOTAS | ||
* Architektur | * Architektur | ||
Zeile 191: | Zeile 191: | ||
* SGA, PGA, Hintergrundprozesse | * SGA, PGA, Hintergrundprozesse | ||
* Definiert durch SGA, Files und DB-Prozesse | * Definiert durch SGA, Files und DB-Prozesse | ||
- | * Hat eindeutige SID | + | * Hat eindeutige SID |
* Orace Server-Prozesse | * Orace Server-Prozesse | ||
* Parsen und Ausführen von SQL, Lesen von DB-Blöcken aus Files | * Parsen und Ausführen von SQL, Lesen von DB-Blöcken aus Files | ||
Zeile 224: | Zeile 224: | ||
* Modularisierte Anwendungsentwicklung | * Modularisierte Anwendungsentwicklung | ||
* Portabilität des PL/SQL-Codes | * Portabilität des PL/SQL-Codes | ||
- | * Exception Handling | + | * Exception Handling |
* PL/SQL-Blöcke | * PL/SQL-Blöcke | ||
* Aufbau | * Aufbau | ||
Zeile 234: | Zeile 234: | ||
* Anonymous | * Anonymous | ||
* Procedure | * Procedure | ||
- | * Function | + | * Function |
* Speicherort: Server oder Anwendung | * Speicherort: Server oder Anwendung | ||
* Variablen | * Variablen | ||
Zeile 252: | Zeile 252: | ||
* referenziert mit führendem ''&'': Eingabe zur Laufzeit | * referenziert mit führendem ''&'': Eingabe zur Laufzeit | ||
* ''ACCEPT varname PROMPT 'Text''' | * ''ACCEPT varname PROMPT 'Text''' | ||
- | * User Variable: deklariert mit ''DEFINE'', referenziert mit ''&'' | + | * User Variable: deklariert mit ''DEFINE'', referenziert mit ''&'' |
* ''%TYPE''-Attribut: Datentyp einer Spalte/Variable übernehmen (''identifier table.column_name%TYPE;'') | * ''%TYPE''-Attribut: Datentyp einer Spalte/Variable übernehmen (''identifier table.column_name%TYPE;'') | ||
- | * Mögliche Boolean-Werte: ''TRUE, FALSE, NULL'' (!) | + | * Mögliche Boolean-Werte: ''TRUE, FALSE, NULL'' (!) |
* Lexikalische Einheiten | * Lexikalische Einheiten | ||
* Folgen von Zeichen, Zahlen, Whitespace und Symbolen | * Folgen von Zeichen, Zahlen, Whitespace und Symbolen | ||
- | * Typen: Identifier, Delimiter, Literals, Comments | + | * Typen: Identifier, Delimiter, Literals, Comments |
* SQL-Funktionen | * SQL-Funktionen | ||
* Nicht in PL/SQL verfügbar: ''DECODE'', ''GROUP''-Funktionen | * Nicht in PL/SQL verfügbar: ''DECODE'', ''GROUP''-Funktionen | ||
Zeile 263: | Zeile 263: | ||
* ''INTO'' wird benötigt | * ''INTO'' wird benötigt | ||
* Abfragen müssen genaue eine Zeile zurückliefern | * Abfragen müssen genaue eine Zeile zurückliefern | ||
- | * Variablenpriorität: Spaltennamen -> lokale Variablen/Parameter -> Tabellennamen | + | * Variablenpriorität: Spaltennamen -> lokale Variablen/Parameter -> Tabellennamen |
* Cursor | * Cursor | ||
* Zeiger auf den privaten Speicherplatz des Oracle-Servers | * Zeiger auf den privaten Speicherplatz des Oracle-Servers | ||
* Implizit: werden intern vom Oracle-Server erzeugt und verwendet (z.B. bei SQL-Statements) | * Implizit: werden intern vom Oracle-Server erzeugt und verwendet (z.B. bei SQL-Statements) | ||
* Attributes: ''SQL%FOUND'', ''SQL%NOTFOUND'', ''SQL%ROWCOUNT'' | * Attributes: ''SQL%FOUND'', ''SQL%NOTFOUND'', ''SQL%ROWCOUNT'' | ||
- | * Explizit: werden vom Programmierer definiert und verwendet | + | * Explizit: werden vom Programmierer definiert und verwendet |
* Kontrollstrukturen | * Kontrollstrukturen | ||
* ''IF THEN - ELSIF - ELSE''' | * ''IF THEN - ELSIF - ELSE''' | ||
Zeile 289: | Zeile 289: | ||
* dynamische Länge | * dynamische Länge | ||
* Zugriff über Index ''table(1)'' | * Zugriff über Index ''table(1)'' | ||
- | * verfügbare Methoden: ''EXISTS, COUNT, FIRST, LAST, PRIOR, NEXT, DELETE'' | + | * verfügbare Methoden: ''EXISTS, COUNT, FIRST, LAST, PRIOR, NEXT, DELETE'' |
* VARRAYs und Nested Tables | * VARRAYs und Nested Tables | ||
* Cursors | * Cursors | ||
Zeile 297: | Zeile 297: | ||
* entsprechen Pointern aus C (Referenz auf Speicherbereich) | * entsprechen Pointern aus C (Referenz auf Speicherbereich) | ||
* Datentyp der Curosr-Variablen ist ''REF CURSOR'' | * Datentyp der Curosr-Variablen ist ''REF CURSOR'' | ||
- | * Cursor sind statisch, Cursor-Variablen sind dynamisch | + | * Cursor sind statisch, Cursor-Variablen sind dynamisch |
* Exceptions | * Exceptions | ||
* Exceptions sind Fehler, die während der Programmausführung auftreten | * Exceptions sind Fehler, die während der Programmausführung auftreten | ||
Zeile 303: | Zeile 303: | ||
* Behandlung: Handler oder weiterwerfen | * Behandlung: Handler oder weiterwerfen | ||
* Es sind mehrere Handler pro Block erlaubt, aber lediglich einer wird abgearbeitet. | * Es sind mehrere Handler pro Block erlaubt, aber lediglich einer wird abgearbeitet. | ||
- | * Vorhandene Exceptions: z.B. ''NO_DATA_FOUND, TOO_MANY_ROWS, ZERO_DIVIDE'' | + | * Vorhandene Exceptions: z.B. ''NO_DATA_FOUND, TOO_MANY_ROWS, ZERO_DIVIDE'' |
* nicht vordefinierte Exceptions behandeln: ''PRAGMA EXCEPTION_INIT'' | * nicht vordefinierte Exceptions behandeln: ''PRAGMA EXCEPTION_INIT'' | ||
* Funktionen: ''SQLCODE, SQLERRM'' | * Funktionen: ''SQLCODE, SQLERRM'' | ||
* Eigene Exceptions werfen: ''RAISE'' | * Eigene Exceptions werfen: ''RAISE'' | ||
- | * Eigene Fehlermeldungen analog zum Oracle-Server ausgeben: ''RAISE_APPLICATION_ERROR'' (nur mit Nummer -20000 bis -20999) | + | * Eigene Fehlermeldungen analog zum Oracle-Server ausgeben: ''RAISE_APPLICATION_ERROR'' (nur mit Nummer -20000 bis -20999) |
* Prozeduren und Funktionen | * Prozeduren und Funktionen | ||
* {{:se:proceduresvsfunctions.jpg|}} | * {{:se:proceduresvsfunctions.jpg|}} | ||
Zeile 313: | Zeile 313: | ||
* {{:se:anonymousblockssubprograms.jpg|}} | * {{:se:anonymousblockssubprograms.jpg|}} | ||
* Parameter | * Parameter | ||
- | * Formal <> actual Parameters | + | * Formal <> actual Parameters |
* Parameter Modes: ''IN, OUT, IN OUT'' | * Parameter Modes: ''IN, OUT, IN OUT'' | ||
- | * {{:se:subprogramparameters.jpg|}} | + | * {{:se:subprogramparameters.jpg|}} |
* Passing: positional, named, combination | * Passing: positional, named, combination | ||
* Kein Zugriff auf Host-Variablem | * Kein Zugriff auf Host-Variablem | ||
Zeile 328: | Zeile 328: | ||
* Vorteile: Modularisierung, einfachere Verwaltung, einfacheres Anwendungsdesign, Information Hiding, bessere Performance (Package wird komplett und nur einmal in den Speicher geladen), Overloading | * Vorteile: Modularisierung, einfachere Verwaltung, einfacheres Anwendungsdesign, Information Hiding, bessere Performance (Package wird komplett und nur einmal in den Speicher geladen), Overloading | ||
* Overloading: Beispiele im ''STANDARD''-Package (z.B. ''TO_CHAR'') | * Overloading: Beispiele im ''STANDARD''-Package (z.B. ''TO_CHAR'') | ||
- | * Forward Declaration: Spezifikation eines Subprograms mit Semikolon abgeschlossen. Wird zu Beginn eines Blocks gemacht, damit Prozeduren auf die möglicherweise weiter unten im Quelltext implementierten Prozeduren zugreifen können. | + | * Forward Declaration: Spezifikation eines Subprograms mit Semikolon abgeschlossen. Wird zu Beginn eines Blocks gemacht, damit Prozeduren auf die möglicherweise weiter unten im Quelltext implementierten Prozeduren zugreifen können. |
* Package Initialization Block: ''BEGIN''-Teil am Ende des package body zur Initialisierung von Variablen. | * Package Initialization Block: ''BEGIN''-Teil am Ende des package body zur Initialisierung von Variablen. | ||
* Package State | * Package State | ||
Zeile 337: | Zeile 337: | ||
* Execution Flow: parse (compile time), bind (compile time), execute, fetch | * Execution Flow: parse (compile time), bind (compile time), execute, fetch | ||
* Dynamic SQL ist ein String | * Dynamic SQL ist ein String | ||
- | * ''EXECUTE IMMEDIATE .. INTO .. USING'' | + | * ''EXECUTE IMMEDIATE .. INTO .. USING'' |
* Triggers | * Triggers | ||
* PL/SQL-Block, der einer Tabelle, einem View, einem Schema oder einer Datenbank zugeordnet ist | * PL/SQL-Block, der einer Tabelle, einem View, einem Schema oder einer Datenbank zugeordnet ist | ||
Zeile 344: | Zeile 344: | ||
* Trigger Events: ''INSERT, UPDATE [OF], DELETE'' | * Trigger Events: ''INSERT, UPDATE [OF], DELETE'' | ||
* Row Trigger: ''FOR EACH ROW, :NEW, :OLD'' | * Row Trigger: ''FOR EACH ROW, :NEW, :OLD'' | ||
- | * {{:se:triggersvsprocedures.jpg|}} | + | * {{:se:triggersvsprocedures.jpg|}} |
===== Web ===== | ===== Web ===== | ||
+ | * Voraussetzung: Database Access Descriptor (DAD) vorhanden | ||
+ | * erzeugen mit DBA-Rechten | ||
+ | * ''DBMS_EPG.create_dad (dad_name => 'systemdad', path => '/systemdad/*');'' | ||
+ | * HTML-Ausgabe über HTP-/HTF-Package | ||
+ | * Vorteile: Aufbau auf PL/SQL, integriert SQL und HTML, kein zusätzliches Konfigurationsmanagement | ||
+ | * Webapplikationen werden als Packages erstellt | ||
+ | * HTML-Erzeugung mit PL/SQL Web Toolkit -> HTP/HTF | ||
+ | * GET vs. POST | ||
+ | * gut für Debugging, Programmstruktur wird offenbart, Bookmarks möglich, begrenzte Länge der URL | ||
+ | * mehrere Parameter (Array): ''OWA_UTIL.ident_arr'' (beginnt bei Index 2) | ||
+ | * Arbeitsweise: Requests kommen anonym auf dem Server an -> Server liefert Seite aus | ||
+ | * Kein Session-Konzept, kein Benutzerlogging | ||
+ | * Designschritte | ||
+ | * {{:se:designschritte.jpg|}} | ||
+ | * Application Design | ||
+ | * High Level Storyboard: Screens und Navigation (Site Map) | ||
+ | * Detailed Storyboard | ||
+ | * Alle Elemente, auf die der Benutzer klicken kann | ||
+ | * Nicht alle Datenfelder, nur soviel um die ausgeführte Aktion erkennen zu können | ||
+ | * Jeder Ausgang aus einer Seite wird mit einem Pfeil mit dem resultierenden Screen verbunden | ||
+ | * Application Flow Diagram: Welche Daten werden zwischen den Seiten ausgetauscht (abwechselnd Procedure/Screen) | ||
+ | * Updates stellen aufgrund des fehlenden Sessionmanagements ein Problem dar (alte Daten müssen mit übergeben werden, um herauszufinden, ob jemand anderes die Daten in der Zwischenzeit bearbeitet hat) | ||
+ | * Skeletons für Procedures/Functions mit den ermittelten Parametern erzeugen | ||
+ | * Page Design | ||
+ | * Beispielseiten erstellen, Fokus auf Layout -> Designer machen lassen | ||
+ | * Übliche Tipps: kein Splashscreen, Browsertests, wenige Grafiken, Web Standards, Formularelemente zur Einschränkung der Benutzereingaben, kontrastreicher Text | ||
+ | * Conversion | ||
+ | * WebAlchemy, html2plsql -> statische Seiten | ||
+ | * Business Logic | ||
+ | * die statischen Seiten mit "echter" Logik versehen | ||
+ | * Modularization | ||
+ | * Trennung von HTML-Ausgabe und Logik | ||
+ | * Header-/Footer-Procedures etc. | ||
+ | * eigene projektübergreifende Webkomponenten erzeugen | ||
===== Modellierung ===== | ===== Modellierung ===== |