PL/SQL <-- --> Datenbanken

SQLJ Syntax

SQLJ Precompile übersetzt #SQLJ statements

String bez;        int ProjektNr;
#sql { SELECT Bezeichnung INTO :bez FROM Projekt
            WHERE ProjektNr = :ProjektNr FOR UPDATE) // for update lockt variable

Aufrufen von Prozeduren

int res =-1;
#sql (CALL ProjektZuteilen (:IN ProjName, :IN AngName, :OUT res) };      //Outparameter muss mit        // :OUT deklariert sein

Aufrufen von Funktionen

String SalyerSumme ='';
#sql { SET :Salaersumme = AbteilungSaler (:IN AbtName) };

Bennanter Iterator

#sql iterator AngIterByName (String abtName, String AngName, int PersNr);        //Definition
AngIterName iter;          //Deklaration
#sql iter =                     //Aufruf
 { SELECT Abt.Name AS AbtName, Ang.Name AS AngName, PersNr
  FROM Abteilung Abt, Abgestellter Ang
  WHERE Abt.AbtNr = Ang.AbtNr);
while (iter.next())           //Navigation
  { System.out.println (iter.AbtName() + ' ' +
                                 iter.AngName() + ' ' + iter.PersNr();
  }
iter.close()                    //close

Stored Procedures in Java

  1. Prozedur in Java schreiben
  2. Java Prozedur in die Datenbank laden
    1. >loadjava 'u scott/tiger@myPC:1521:orcl -v 'r 't POManager.java
  3. Publiziere Prozedur als Stored Procedure im Oracle Data Dictionary
  4. Verwenden der Stored Procedure
    1. aus PL/SQL (Stored Procedure, Trigger)
    2. aus Client (via JDBC, SQLJ)

Datenbanksicherheit

System Security:          Zugrifskontrolle, Benutzerprivilegien, System-Ressourcen
Data Security:               Zugriffskontrolle auf Datenobjekte

Benuzter erzeugen
CREATE user IDENTIFIED BY password;

SystemPrivilegien

create session              Verbindung zu DB
create table                  Tabelle erzeugen
create user
grant any privilege         Systemprivilegien erteilen
create role
grant any role

Beispiel
GRANT create table, create session, create view TO rudi;

ROLLEN

CREATE ROLE Entwickler;       //erstellen
GRANT                                    //modifizieren
  create session, create table, create view, create trigger, create procedure,
  create synonym, create sequence, create role
TO Entwickler;

GRANT Entwickler to rudi;         //Rolle zuteilen

Object Privileges

GRANT object_priv [(colmns)]
ON       object
TO        {user|role|PUBLIC}
[WITH GRANT OPTION];

Auflistung der objektprovilegien:

ALTER, DELETE, INSERT, REFERENCES, SELECT, UPDATE, EXECUTE
Beispiele:
GRANT SELECT ON Angestellr TO PUBLIC //alle Benutzer
GRANT ALL ON Abteilung TO Nueller WITH GRANT OPTION //darf rechte weiter geben
Rechte entziehen mit REVOKE
REVOKE UPDATE(Salaer) ON Angestellter FROM Perschef

Zugriffsberechtigungen

mittels CRUD MATRIX
            CREATE, READ, UPDATE, DELETE

Transaktionen

Fehlersituationen:
            lost update        (die Modifikation einer Transaktion geht verloren)
            dirty read          (Es wird ein Wert gelesen, der noch nicht mir commit festgeschrieben wurde)
            non-repeatable read       (Werte werden gelesen, die gleichzeitig gelesen werden)
            Phantom Rows             (Eine Abfrage führt zu zwei verschiedenen Ergebnissen)

Ablaufplan (Schedule)

seriell               eine Transaktion nach der anderen vollständig ausgeführt
nicht-seriell       verschiedene parallele ablaufenden Transaktionen werden verzahnt ausgeführt
konsistent         nicht-seriell liefert das selbe Resultat wie ein serieller Ablaufplan

Synchronisationsverfahren

Sperrprotokolle                         (Locks)
optimistische Verfahren             im Normalfall keine Konflikte, bei commit wird geprüft
x-lock              Exklusives Sperren
s-lock               Teil Sperren, Andere Transaktionen können den Wert nur lesen

Two-phase-locking:

  1. Datenelemente mit Sperre belegen
  2. Nach Freigabe keine neuen Sperren mehr
  3. Am Ende der Transaktion sind alle Sperren wieder aufgelöst

(Kann zu cascading rollback führen)

Auftreten von Deadlocks:
a)       Gegenseitiger Ausschluss (mutual exclusion)
b)       Hold and Wait   (auf andere Transaktionen warten)
c)       Non preemption (resource können nicht entzogen werden)
d)       Circular Wait     (alle Transaktionen warten auf eine andere Transaktion)

-> Erkennung mit Resource Request Graph

Isolationlevels

read uncommited          lesen möglich ohne commit abschluss, sehr schnell
read commited              lesen erst nach abschluss mit commit    (nonrepetable read, phantom rows)
repeatable read             garantiert wiederholbare Lesevorgäge      (Synchronisationsaufwand, phantoms)
serializable                   garantiert Serialisierbarkeit, bietet Sicherheit

SET TRANSACTION [read only|write only] ISOLATION LEVEL read commited

Recovery (Datensicherung)

Fehlersituationen:
Transaktionsfehler         Rollback
Systemfehler                Fehler in DBMS, Recovery
Media Fehler                 Diskcrash, Recovery

Auditing

Statement-Auditing        Überwachung einzelner Gruppen von Operationen

Privileg-Auditing Überwachung der Nutzung von Privilegien

Objekt-Auditing             Überwachung einzelner Datenobjekte

Wert basierstes Auditing mittels Triggers.

ORDB   Objektrelationale Datenbanksysteme

ADT      Abstract Data Type
OID      Object Identifier, 16 Byte Systemweit eindeutig
CREATE OR REPLACE TYPE AbtilungsTyp; /   -- forward declaration
CREATE OR REPLACE TYPE AngestellterTyp AS OBJECT
( PersNr                       Integer,
  Name                         VARCAHR2(20);
  AbtMA                       REF AbteilungsTyp,
  HeimAdresse  AdrTyp,
  MAP MEMBER FUNCTION sortorder RETURN VARCHAR2
) /

CREATE TABLE Angestellter OF AngestellterTyp
( PersNr PRIMARY KEY,
  abtMA NOT NULL,
  Name NOT NULL UNIQUE,
  Chef Default NULL
);

INSERT INTO Angestellter VALUES (110, 'Mueller', 8000,
            (SELECT REF(abt) FROM Abteilung abt             //Liefert Referenz OID
             WHERE abt.AbtNr=1),
            NULL, adrTyp('Seestrasse','Zürich','8008'));

UPDATE Abteilung SET Abtchef =
            (SELECT Ref(ang) FROM Angestellter ang
             WHERE ang.PersNr=110)
WHERE Name='Marketing';

SELECT ang.Name, ang.chef.Name FROM Angestellter ang ORDER BY value(ang);

SELECT ang.Name, ang.HeimAdresse.Wohnort FROM Angestellter ang WHERE ang.AbtMA.Name = 'Entwicklung';

PL/SQL <-- --> Datenbanken Übersicht