Kapitel 9+10
This commit is contained in:
parent
db3b2f240b
commit
e0fdf429ba
@ -1198,13 +1198,429 @@ Motivation: Die Sprache QBE
|
|||||||
|
|
||||||
# Transaktionen, Integrität und Trigger
|
# Transaktionen, Integrität und Trigger
|
||||||
## Grundbegriffe
|
## Grundbegriffe
|
||||||
|
Integritätsbedingung (engl. integrity constraint oder assertion): Bedingung für die „Zulässigkeit“ oder „Korrektheit“
|
||||||
|
|
||||||
|
1. Typintegrität
|
||||||
|
- SQL erlaubt Angabe von Wertebereichen zu Attributen
|
||||||
|
- Erlauben oder Verbieten von Nullwerten
|
||||||
|
2. Schlüsselintegrität
|
||||||
|
- Angabe eines Schlüssels für eine Relation
|
||||||
|
3. Referentielle Integrität
|
||||||
|
- die Angabe von Fremdschlüsseln
|
||||||
|
|
||||||
## Transaktionsbegriff
|
## Transaktionsbegriff
|
||||||
|
Beispiel:
|
||||||
|
- Platzreservierung für Flüge gleichzeitig aus vielen Reisebüros → Platz könnte mehrfach verkauft werden, wenn mehrere Reisebüros den Platz als verfügbar identifizieren
|
||||||
|
- überschneidende Kontooperationen einer Bank
|
||||||
|
- statistische Datenbankoperationen → Ergebnisse sind verfälscht, wenn während der Berechnung Daten geändert werden
|
||||||
|
|
||||||
|
> Transaktion: Eine Transaktion ist eine Folge von Operationen (Aktionen), die die Datenbank von einem konsistenten Zustand in einen konsistenten, eventuell veränderten, Zustand überführt, wobei das ACID-Prinzip eingehalten werden muss.
|
||||||
|
- Aspekte:
|
||||||
|
- Semantische Integrität: Korrekter (konsistenter) DB-Zustand nach Ende der Transaktion
|
||||||
|
- Ablaufintegrität: Fehler durch "gleichzeitigen" Zugriff mehrerer Benutzer auf dieselben Daten vermeiden
|
||||||
|
|
||||||
|
ACID-Eigenschaften
|
||||||
|
- Atomicity (Atomarität): Transaktion wird entweder ganz oder gar nicht ausgeführt
|
||||||
|
- Consistency (Konsistenz oder auch Integritätserhaltung): Datenbank ist vor Beginn und nach Beendigung einer Transaktion jeweils in einem konsistenten Zustand
|
||||||
|
- Isolation (Isolation): Nutzer, der mit einer Datenbank arbeitet, sollte den Eindruck haben, dass er mit dieser Datenbank alleine arbeitet
|
||||||
|
- Durability (Dauerhaftigkeit / Persistenz): nach erfolgreichem Abschluss einer Transaktion muss das Ergebnis dieser Transaktion „dauerhaft“ in der Datenbank gespeichert werden
|
||||||
|
|
||||||
|
Kommandos einer Transaktionssprache
|
||||||
|
- Beginn einer Transaktion: Begin-of-Transaction-Kommando BOT (in SQL implizit!)
|
||||||
|
- commit: die Transaktion soll erfolgreich beendet werden
|
||||||
|
- abort: die Transaktion soll abgebrochen werden
|
||||||
|
|
||||||
|
Vereinfachtes Modell für Transaktion
|
||||||
|
- Repräsentation von Datenbankänderungen einer Transaktion
|
||||||
|
- `read(A,x)`: weise den Wert des DB-Objektes A der Variablen x zu
|
||||||
|
- `write(x, A)`: speichere den Wert der Variablen x im DB-Objekt A
|
||||||
|
- Beispiel einer Transaktion T:
|
||||||
|
- `read(A, x); x := x − 200; write(x, A);`
|
||||||
|
- `read(B, y); y := y + 100; write(y, B);`
|
||||||
|
- Ausführungsvarianten für zwei Transaktionen T_1 , T_2 :
|
||||||
|
- seriell, etwa T_1 vor T_2
|
||||||
|
- „gemischt“, etwa abwechselnd Schritte von T_1 und T_2
|
||||||
|
- Probleme im Mehrbenutzerbetrieb
|
||||||
|
- Inkonsistentes Lesen: Nonrepeatable Read
|
||||||
|
- Variablen/Speicher ändert sich durch fertigstellen anderer Transaktionen während des Ablaufs
|
||||||
|
- Abhängigkeiten von nicht freigegebenen Daten: Dirty Read
|
||||||
|
- T_1 ändert X
|
||||||
|
- T_2 liest X und rechnet damit
|
||||||
|
- T_1 bricht ab und setzt änderung zurück
|
||||||
|
- Ergebnis von T_2 ist damit falsch
|
||||||
|
- Das Phantom-Problem
|
||||||
|
- durch `insert` ändert sich `select` ergebnis; nachfolgende rechnungen auf vorherigen abruf sind falsch
|
||||||
|
- Verlorengegangenes Ändern: Lost Update
|
||||||
|
- updates gehen verloren, wenn gleiche Variablen gleicheitig beschrieben werden (oder kurz nacheinander)
|
||||||
|
|
||||||
|
> Serialisierbarkeit: Eine verschränkte Ausführung mehrerer Transaktionen heißt serialisierbar, wenn ihr Effekt identisch zum Effekt einer (beliebig gewählten) seriellen Ausführung dieser Transaktionen ist.
|
||||||
|
- Schedule: "Ablaufplan" für Transaktion, bestehend aus Abfolge von Transaktionsoperationen
|
||||||
|
|
||||||
## Transaktionen in SQL
|
## Transaktionen in SQL
|
||||||
|
Aufweichung von ACID in SQL: Isolationsebenen
|
||||||
|
```sql
|
||||||
|
set transaction
|
||||||
|
[ { read only | read write }, ]
|
||||||
|
[isolation level
|
||||||
|
{ read uncommitted |
|
||||||
|
read committed |
|
||||||
|
repeatable read |
|
||||||
|
serializable }, ]
|
||||||
|
[ diagnostics size ...]
|
||||||
|
```
|
||||||
|
Standardeinstellung:
|
||||||
|
```sql
|
||||||
|
set transaction read write,
|
||||||
|
isolation level serializable
|
||||||
|
```
|
||||||
|
|
||||||
|
Bedeutung der Isolationsebenen
|
||||||
|
- **read uncommitted**
|
||||||
|
- schwächste Stufe: Zugriff auf nicht geschriebene Daten, nur für read only Transaktionen
|
||||||
|
- statistische und ähnliche Transaktionen (ungefährer Überblick, nicht korrekte Werte)
|
||||||
|
- keine Sperren → effizient ausführbar, keine anderen Transaktionen werden behindert
|
||||||
|
- **read committed**: nur Lesen endgültig geschriebener Werte, aber nonrepeatable read möglich
|
||||||
|
- **repeatable read**: kein nonrepeatable read, aber Phantomproblem kann auftreten
|
||||||
|
- **serializable**: garantierte Serialisierbarkeit
|
||||||
|
|
||||||
|
|
||||||
## Integritätsbedingungen in SQL
|
## Integritätsbedingungen in SQL
|
||||||
|
- **not null**: Nullwerte verboten
|
||||||
|
- **default**: Angabe von Default-Werten
|
||||||
|
- **check** ( search-condition ):
|
||||||
|
- Attributspezifische Bedingung (in der Regel Ein-Tupel-Integritätsbedingung)
|
||||||
|
- Festlegung weitere lokale Integritätsbedingungen innerhalb der zu definierenden Wertebereiche, Attribute und Relationenschemata
|
||||||
|
- Beispiel:
|
||||||
|
```sql
|
||||||
|
create table WEINE (
|
||||||
|
WeinID int primary key,
|
||||||
|
Name varchar(20) not null,
|
||||||
|
Jahr int check(Jahr between 1980 and 2010),
|
||||||
|
...
|
||||||
|
)
|
||||||
|
```
|
||||||
|
- **primary key**: Angabe eines Primärschlüssel
|
||||||
|
- **foreign key** ( Attribut(e) ) **references** Tabelle( Attribut(e) ): Angabe der referentiellen Integrität
|
||||||
|
- **create domain**: Festlegung eines benutzerdefinierten Wertebereichs
|
||||||
|
- Beispiel:
|
||||||
|
```sql
|
||||||
|
create domain WeinFarbe varchar(4)
|
||||||
|
default 'Rot'
|
||||||
|
check (value in ('Rot', 'Weiß', 'Rose'))
|
||||||
|
|
||||||
|
create table WEINE ( WeinID int primary key, Name varchar(20) not null, Farbe WeinFarbe, ...)
|
||||||
|
```
|
||||||
|
|
||||||
|
Erhaltung der referentiellen Integrität
|
||||||
|
- Überprüfung der Fremdschlüsselbedingungen nach Datenbankänderungen
|
||||||
|
- Überprüfungsmodi von Bedingungen
|
||||||
|
- `on update | delete`: Angabe eines Auslöseereignisses, das die Überprüfung der Bedingung anstößt
|
||||||
|
- `cascade | set null | set default | no action`: Kaskadierung: Behandlung einiger Integritätsverletzungen pflanzt sich über mehrere Stufen fort, z.B. Löschen als Reaktion auf Verletzung der referentieller Integrität
|
||||||
|
- `deferred | immediate` legt Überprüfungszeitpunkt für eine Bedingung fest
|
||||||
|
- `deferred`: Zurückstellen an das Ende der Transaktion
|
||||||
|
- `immediate`: sofortige Prüfung bei jeder relevanten Datenbankänderung
|
||||||
|
- Beispiel: `... foreign key (Weingut) references ERZEUGER (Weingut) on delete cascade`
|
||||||
|
|
||||||
|
Die assertion-Klausel
|
||||||
|
- Assertion: Prädikat, das eine Bedingung ausdrückt, die von der Datenbank immer erfüllt sein muss
|
||||||
|
- Syntax (SQL:2003) `create assertion name check ( prädikat )`
|
||||||
|
|
||||||
## Trigger
|
## Trigger
|
||||||
|
- Trigger: Anweisung/Prozedur, die bei Eintreten eines bestimmten Ereignisses automatisch vom DBMS ausgeführt wird
|
||||||
|
- Anwendung:
|
||||||
|
- Erzwingen von Integritätsbedingungen („Implementierung“ von Integritätsregeln)
|
||||||
|
- Auditing von DB-Aktionen
|
||||||
|
- Propagierung von DB-Änderungen
|
||||||
|
- Definition:
|
||||||
|
```sql
|
||||||
|
create trigger ...
|
||||||
|
after Operation
|
||||||
|
Anweisungen
|
||||||
|
```
|
||||||
|
- Beispiel: Einfügen von neuen Aufträgen
|
||||||
|
```sql
|
||||||
|
create trigger Auftragszählung+
|
||||||
|
on insertion of Auftrag A:
|
||||||
|
update Kunde
|
||||||
|
set AnzAufträge = AnzAufträge + 1
|
||||||
|
where KName = new A.KName
|
||||||
|
|
||||||
|
create trigger Auftragszählung-
|
||||||
|
on deletion ...:
|
||||||
|
update ...- 1 ...
|
||||||
|
```
|
||||||
|
- Spezifikation von
|
||||||
|
- Ereignis und Bedingung für Aktivierung des Triggers
|
||||||
|
- Aktion(en) zur Ausführung
|
||||||
|
- Syntax in SQL:2003 festgelegt
|
||||||
|
```sql
|
||||||
|
create trigger Name
|
||||||
|
after | before Ereignis
|
||||||
|
on Relation
|
||||||
|
[ when Bedingung ]
|
||||||
|
begin atomic SQL-Anweisungen end
|
||||||
|
```
|
||||||
|
- verfügbar in den meisten kommerziellen Systemen (aber mit anderer Syntax)
|
||||||
|
- Weitere Angaben bei Triggern
|
||||||
|
- **for each row** bzw. **for each statement**: Aktivierung des Triggers für jede Einzeländerungen einer mengenwertigen Änderung oder nur einmal für die gesamte Änderung
|
||||||
|
- **before** bzw. **after**: Aktivierung vor oder nach der Änderung
|
||||||
|
- **referencing new as** bzw. **referencing old as**: Binden einer Tupelvariable an die neu eingefügten bzw. gerade gelöschten („alten“) Tupel einer Relation ⇝ Tupel der Differenzrelationen
|
||||||
|
|
||||||
|
Integritätssicherung durch Trigger
|
||||||
|
1. Bestimme Objekt $o_i$ , für das die Bedingung $\phi$ überwacht werden soll
|
||||||
|
- i.d.R. mehrere $o_i$ betrachten, wenn Bedingung relationsübergreifend ist
|
||||||
|
- Kandidaten für $o_i$ sind Tupel der Relationsnamen, die in $\phi$ auftauchen
|
||||||
|
2. Bestimme die elementaren Datenbankänderungen $u_{ij}$ auf Objekten $o_i$ , die $\phi$ verletzen können
|
||||||
|
- Regeln: z.B. Existenzforderungen beim Löschen und Ändern prüfen, jedoch nicht beim Einfügen etc.
|
||||||
|
3. Bestimme je nach Anwendung die Reaktion $r_i$ auf Integritätsverletzung
|
||||||
|
- Rücksetzen der Transaktion (rollback)
|
||||||
|
- korrigierende Datenbankänderungen
|
||||||
|
4. Formuliere folgende Trigger:
|
||||||
|
`create trigger t-phi-ij after u ij on o i when ¬φ begin r i end`
|
||||||
|
5. Wenn möglich, vereinfache entstandenen Trigger
|
||||||
|
|
||||||
|
Trigger in Oracle: Arten
|
||||||
|
- Prädikat zur Einschränkung (when)
|
||||||
|
- Zugriff auf altes (:old.col) bzw. neues (:new.col) Tupel
|
||||||
|
- für delete: nur (:old.col)
|
||||||
|
- für insert: nur (:new.col)
|
||||||
|
- in when-Klausel nur (new.col) bzw. (old.col)
|
||||||
|
- Transaktionsabbruch durch raise_application_error(code, message)
|
||||||
|
- Unterscheidung der Art der DML-Anweisung
|
||||||
|
- `if deleting then ... end if;`
|
||||||
|
- `if updating then ... end if;`
|
||||||
|
- `if inserting then ... end if;`
|
||||||
|
|
||||||
## Schemaevolution
|
## Schemaevolution
|
||||||
|
- Änderung eines Datenbankschemas durch neue/veränderte Anforderungen
|
||||||
|
- Hinzufügen oder Löschen von Tabellen, Spalten, Integritätsbedingungen
|
||||||
|
- Umbenennen oder Datentypänderungen
|
||||||
|
- erfordert oft auch Anpassung/Übertragung der vorhandenen Datenbank ⇝ Datenbankmigration
|
||||||
|
- leider nur eingeschränkte Unterstützung durch DB-Werkzeuge (DDL + Export/Import der Daten)
|
||||||
|
|
||||||
|
- SQL-DDL zum Löschen von Tabellen
|
||||||
|
- Löschen von Tabellendefinitionen (beachte Unterschied zu delete)
|
||||||
|
`drop table relationenname [ restrict | cascade ]`
|
||||||
|
- cascade: erzwingt Löschen aller Sichten und Integritätsbedingungen, die zu dieser Basisrelation gehören
|
||||||
|
- restrict (Defaultfall): das drop-Kommando wird zurückgewiesen, falls noch solche Sichten und Integritätsbedingungen existieren
|
||||||
|
- SQL-DDL zur Änderung von Tabellen
|
||||||
|
- `alter table relationenname modifikation`
|
||||||
|
- **add column spaltendefinition** fügt eine neue Spalte hinzu; alle bereits in der Tabelle existierenden Tupel erhalten als Wert der neuen Spalte den angegebenen Defaultwert bzw. den null-Wert
|
||||||
|
- **drop column spaltenname** löscht die angegebene Spalte (inkl. restrict- bzw. cascade)
|
||||||
|
- **alter column spaltenname set default defaultwert** verändert Defaultwert der Spalte
|
||||||
|
- Änderung von Integritätsbedingungen
|
||||||
|
- nachträgliches Hinzufügen/Löschen von Tabellenbedingungen über **alter table**
|
||||||
|
- Vergabe von Namen für Bedingungen über constraint bed-name-Klausel
|
||||||
|
```sql
|
||||||
|
alter table WEINE
|
||||||
|
add constraint WeinBed_Eindeutig
|
||||||
|
unique (Name, Weingut)
|
||||||
|
```
|
||||||
|
- Löschen über Namen `alter table WEINE drop constraint WeinBed_Eindeutig`
|
||||||
|
|
||||||
# Sichten und Zugriffskontrolle
|
# Sichten und Zugriffskontrolle
|
||||||
|
## Sichtenkonzept
|
||||||
|
> Sichten: virtuelle Relationen (bzw virtuelle Datenbankobjekte in anderen Datenmodellen) (englisch view)
|
||||||
|
- Sichten sind externe DB-Schemata folgend der 3-Ebenen-Schemaarchitektur
|
||||||
|
- Sichtdefinition
|
||||||
|
- Relationenschema (implizit oder explizit)
|
||||||
|
- Berechnungsvorschrift für virtuelle Relation, etwa SQL-Anfrage
|
||||||
|
- Vorteile
|
||||||
|
- Vereinfachung von Anfragen für den Benutzer der Datenbank, etwa indem oft benötigte Teilanfragen als Sicht realisiert werden
|
||||||
|
- Möglichkeit der Strukturierung der Datenbankbeschreibung, zugeschnitten auf Benutzerklassen
|
||||||
|
- logische Datenunabhängigkeit ermöglicht Stabilität der Schnittstelle für Anwendungen gegenüber Änderungen der Datenbankstruktur
|
||||||
|
- Beschränkung von Zugriffen auf eine Datenbank im Zusammenhang mit der Zugriffskontrolle
|
||||||
|
- Probleme
|
||||||
|
- automatische Anfragetransformation
|
||||||
|
- Durchführung von Änderungen auf Sichten
|
||||||
|
- Definition von Sichten in SQL
|
||||||
|
```sql
|
||||||
|
create view SichtName [ SchemaDeklaration ]
|
||||||
|
as SQLAnfrage
|
||||||
|
[ with check option ]
|
||||||
|
```
|
||||||
|
- Beispiel: alle Rotweine aus Bordeaux
|
||||||
|
```sql
|
||||||
|
create view Rotweine as
|
||||||
|
select Name, Jahrgang, WEINE.Weingut
|
||||||
|
from WEINE natural join ERZEUGER
|
||||||
|
where Farbe = 'Rot' and Region = 'Bordeaux'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Änderungen auf Sichten
|
||||||
|
Kriterien für Änderungen auf Sichten
|
||||||
|
- Effektkonformität: Benutzer sieht Effekt als wäre die Änderung auf der Sichtrelation direkt ausgeführt worden
|
||||||
|
- Minimalität: Basisdatenbank sollte nur minimal geändert werden, um den erwähnten Effekt zu erhalten
|
||||||
|
- Konsistenzerhaltung: Änderung einer Sicht darf zu keinen Integritätsverletzungen der Basisdatenbank führen
|
||||||
|
- Respektierung des Datenschutzes: Wird die Sicht aus Datenschutzgründen eingeführt, darf der bewusst ausgeblendete Teil der Basisdatenbank von Änderungen der Sicht nicht betroffen werden
|
||||||
|
|
||||||
|
Projektionssicht: $WNW:=\pi_{WeinID, Name, Weingut}(WEINE)$
|
||||||
|
- in sql mit create view Anweisung
|
||||||
|
`create view WNW as select WeinID, Name, Weingut from WEINE`
|
||||||
|
- Änderungsanweisung für die Sicht WNW:
|
||||||
|
`insert into WNW values (3333, 'Dornfelder', 'Müller')`
|
||||||
|
- Problem der Konsistenzerhaltung falls Farbe oder Jahrgang als not null deklariert!
|
||||||
|
|
||||||
|
Selektionssichten: $WJ:=\sigma_{Jahrgang>2000}(\pi_{WeinID, Jahrgang}(WEINE))$
|
||||||
|
```sql
|
||||||
|
create view WJ as
|
||||||
|
select WeinID, Jahrgang
|
||||||
|
from WEINE
|
||||||
|
where Jahrgang > 2000
|
||||||
|
```
|
||||||
|
|
||||||
|
Kontrolle der Tupelmigration
|
||||||
|
```sql
|
||||||
|
create view WJ as
|
||||||
|
select WeinID, Jahrgang
|
||||||
|
from WEINE
|
||||||
|
where Jahrgang > 2000
|
||||||
|
with check option
|
||||||
|
```
|
||||||
|
|
||||||
|
Verbundsichten $WE := WEINE \bowtie ERZEUGER$
|
||||||
|
- In SQL:
|
||||||
|
```sql
|
||||||
|
create view WE as
|
||||||
|
select WeinID, Name, Farbe, Jahrgang,
|
||||||
|
WEINE.Weingut, Anbaugebiet, Region
|
||||||
|
from WEINE, ERZEUGER
|
||||||
|
where WEINE.Weingut = ERZEUGER.Weingut
|
||||||
|
```
|
||||||
|
- Änderungsoperationen hier in der Regel nicht eindeutig übersetzbar:
|
||||||
|
`insert into WE values (3333, 'Dornfelder', 'Rot', 2002, 'Helena', 'Barossa Valley', 'Südaustralien')`
|
||||||
|
- Änderung wird transformiert zu
|
||||||
|
`insert into WEINE values (3333, 'Dornfelder', 'Rot', 2002, 'Helena')`
|
||||||
|
- plus Änderung auf ERZEUGER !
|
||||||
|
|
||||||
|
Aggregierungssichten
|
||||||
|
```sql
|
||||||
|
create view FM (Farbe, MinJahrgang) as
|
||||||
|
select Farbe, min(Jahrgang)
|
||||||
|
from WEINE
|
||||||
|
group by Farbe
|
||||||
|
```
|
||||||
|
- Folgende Änderung ist nicht eindeutig umsetzbar:
|
||||||
|
```sql
|
||||||
|
update FM
|
||||||
|
set MinJahrgang = 1993
|
||||||
|
where Farbe = 'Rot'
|
||||||
|
```
|
||||||
|
|
||||||
|
Klassifikation der Problembereiche
|
||||||
|
1. Verletzung der Schemadefinition (z.B. Einfügen von Nullwerten bei Projektionssichten)
|
||||||
|
2. Datenschutz: Seiteneffekte auf nicht-sichtbaren Teil der Datenbank vermeiden (Tupelmigration, Selektionssichten)
|
||||||
|
3. nicht immer eindeutige Transformation: Auswahlproblem
|
||||||
|
4. Aggregierungssichten (u.a.): keine sinnvolle Transformation möglich
|
||||||
|
5. elementare Sichtänderung soll genau einer atomaren Änderung auf Basisrelation entsprechen: 1:1-Beziehung zwischen Sichttupeln und Tupeln der Basisrelation (kein Herausprojizieren von Schlüsseln)
|
||||||
|
|
||||||
|
SQL-92-Standard
|
||||||
|
- Integritätsverletzende Sichtänderungen nicht erlaubt
|
||||||
|
- datenschutzverletzende Sichtänderungen: Benutzerkontrolle (with check option)
|
||||||
|
- Sichten mit nicht-eindeutiger Transformation: Sicht nicht änderbar (SQL-92 restriktiver als notwendig)
|
||||||
|
|
||||||
|
Einschränkungen für Sichtänderungen
|
||||||
|
- änderbar nur Selektions- und Projektionssichten (Verbund und Mengenoperationen nicht erlaubt)
|
||||||
|
- 1:1-Zuordnung von Sichttupeln zu Basistupeln: kein distinct in Projektionssichten
|
||||||
|
- Arithmetik und Aggregatfunktionen im select-Teil sind verboten
|
||||||
|
- genau eine Referenz auf einen Relationsnamen im from-Teil erlaubt (auch kein Selbstverbund)
|
||||||
|
- keine Unteranfragen mit „Selbstbezug“ im where-Teil erlaubt (Relationsname im obersten SFW-Block nicht in from-Teilen von Unteranfragen verwenden)
|
||||||
|
- group by und having verboten
|
||||||
|
- seit SQL:2003 Aufhebung einiger Einschränkungen, insbesondere
|
||||||
|
- updates auf union all-Sichten (ohne Duplikateliminierung)
|
||||||
|
- Inserts in Verbundsichten mit Primär-/Fremdschlüsselbeziehungen (mit einigen Einschränkungen)
|
||||||
|
- Updates auf Verbundsichten mit Cursor
|
||||||
|
|
||||||
|
Alternative: Sichtänderungen mit Instead-of-Triggern
|
||||||
|
- Definition von Triggern auf Sichten zur anwendungsspezifischen Propagierung der Änderungen auf die Basistabellen
|
||||||
|
```sql
|
||||||
|
create view V_WEINERZEUGER as
|
||||||
|
select * from WEINE natural join ERZEUGER;
|
||||||
|
create trigger V_WEINERZEUGER_Insert
|
||||||
|
instead of insert on V_WEINERZEUGER
|
||||||
|
referencing new as N
|
||||||
|
for each row
|
||||||
|
begin
|
||||||
|
insert into WEINE values (:N.WeinID, :N.Name,
|
||||||
|
:N.Farbe, :N.Jahrgang, :N.Weingut);
|
||||||
|
end;
|
||||||
|
```
|
||||||
|
|
||||||
|
Auswertung von Anfragen an Sichten
|
||||||
|
- select: Sichtattribute evtl. umbenennen bzw. durch Berechnungsterm ersetzen
|
||||||
|
- from: Namen der Originalrelationen
|
||||||
|
- konjunktive Verknüpfung der where-Klauseln von Sichtdefinition und Anfrage (evtl. Umbenennungen)
|
||||||
|
- Vorsicht bei Aggregationssichten!
|
||||||
|
- having versus where
|
||||||
|
- keine geschachtelten Aggregationen in SQL
|
||||||
|
|
||||||
|
## Rechtevergabe
|
||||||
|
- Zugriffsrechte (AutorisierungsID, DB-Ausschnitt, Operation)
|
||||||
|
- AutorisierungsID ist interne Kennung eines „Datenbankbenutzers“
|
||||||
|
- Datenbank-Ausschnitte: Relationen und Sichten
|
||||||
|
- DB-Operationen: Lesen, Einfügen, Ändern, Löschen
|
||||||
|
|
||||||
|
```sql
|
||||||
|
grant Rechte
|
||||||
|
on Tabelle
|
||||||
|
to BenutzerListe
|
||||||
|
[with grant option]
|
||||||
|
```
|
||||||
|
- In Rechte-Liste: all bzw. Langform all privileges oder Liste aus select, insert, update, delete
|
||||||
|
- Hinter on: Relationen- oder Sichtname
|
||||||
|
- Hinter to: Autorisierungsidentifikatoren (auch public, group)
|
||||||
|
- spezielles Recht: Recht auf die Weitergabe von Rechten (with grant option)
|
||||||
|
|
||||||
|
Autorisierung für public: „Jeder Benutzer kann seine Aufträge sehen und neue Aufträge einfügen (aber nicht löschen!).“
|
||||||
|
```sql
|
||||||
|
create view MeineAufträge as
|
||||||
|
select *
|
||||||
|
from AUFTRAG
|
||||||
|
where KName = user;
|
||||||
|
grant select, insert
|
||||||
|
on MeineAufträge
|
||||||
|
to public;
|
||||||
|
```
|
||||||
|
|
||||||
|
Zurücknahme von Rechten
|
||||||
|
```sql
|
||||||
|
revoke Rechte
|
||||||
|
on Tabelle
|
||||||
|
from BenutzerListe
|
||||||
|
[restrict | cascade ]
|
||||||
|
```
|
||||||
|
- restrict: Falls Recht bereits an Dritte weitergegeben: Abbruch von revoke
|
||||||
|
- cascade: Rücknahme des Rechts mittels revoke an alle Benutzer propagiert, die es von diesem Benutzer mit grant erhalten haben
|
||||||
|
|
||||||
|
|
||||||
|
## Privacy-Aspekte
|
||||||
|
> Privacy (Privatsphäre): das Recht jedes Einzelnen auf einen geschützten privaten Raum, der von anderen nur in definierten Ausnahmefällen verletzt werden darf
|
||||||
|
- elektronische Autobahn-Mautsysteme: Überwachung von Fahrzeugen
|
||||||
|
- Kreditkartenaktivitäten und diverse Payback- bzw. Rabattkarten: Kaufverhalten von Kunden
|
||||||
|
- Mobilfunksysteme: Bewegungsprofile der Nutzer
|
||||||
|
- RFID-Technologie: etwa im Einzelhandel Kaufverhalten, Warenflüsse, etc.
|
||||||
|
|
||||||
|
Statistische Datenbanken
|
||||||
|
- Datenbanken, in denen die Einzeleinträge dem Datenschutz unterliegen, aber statistische Informationen allen Benutzern zugänglich sind
|
||||||
|
- statistische Information = aggregierte Daten (Durchschnittseinkommen etc.)
|
||||||
|
- Problem: Gewinnung von Einzelinformationen durch indirekte Anfragen
|
||||||
|
- Abhilfe: keine Anfragen, die weniger als n Tupel selektieren
|
||||||
|
- Abhilfe: statistische Anfragen nicht erlauben, die paarweise einen Durchschnitt von mehr als m vorgegebenen Tupeln betreffen
|
||||||
|
> Sind nur Ergebnisse von Aggregatfunktionen erlaubt, dann benötigt eine Person 1 + (n − 2)/m Anfragen, um einen einzelnen Attributwert zu ermitteln
|
||||||
|
|
||||||
|
> k-Anonymität: ein bestimmter Sachverhalt kann nicht zwischen einer vorgegebenen Anzahl k von Tupeln unterschieden werden
|
||||||
|
- für viele Zwecke (klinische Studien etc.) werden auch Detaildaten (Mikrodaten) benötigt
|
||||||
|
- weitere Zuordnungen (Namen etc.) etwa durch Verbund mit anderen Daten möglich?
|
||||||
|
- Lösung: Data Swapping (??)
|
||||||
|
- Vertauschen von Attributwerten einzelner Tupel
|
||||||
|
- statistische Analysen noch gültig?
|
||||||
|
- eine Anfrage nach einer beliebigen Kombination von Alter, Geschlecht, Familienstand und Postleitzahl liefert entweder eine leere Relation oder mindestens k Tupel
|
||||||
|
- Ansätze
|
||||||
|
- Generalisierung: Attributwerte durch allgemeinere Werte ersetzen, die einer Generalisierungshierarchie entnommen sind
|
||||||
|
- die Verallgemeinerung des Alters einer Person zu Altersklassen: $\{35, 39\} \rightarrow 30-40$
|
||||||
|
- Weglassen von Stellen bei Postleitzahlen: $\{ 39106, 39114 \}\rightarrow 39***$
|
||||||
|
- Unterdrücken von Tupeln: Löschen von Tupeln, welche die k-Anonymität verletzen und damit identifizierbar sind
|
||||||
|
|
||||||
# NoSQL Datenbanken
|
# NoSQL Datenbanken
|
||||||
|
|
||||||
|
# Anwendungsprogrammierung
|
Loading…
Reference in New Issue
Block a user