2016-05-09 9 views
0

Ich gehe durch eine alte Vergangenheit Papier auf Datenbank-Server-Management für meine Prüfung morgen und kann nicht für das Leben von mir beantworten. Könnte mir jemand eine knappe Antwort geben oder mir wenigstens in die richtige Richtung zeigen? Jede Hilfe wird sehr geschätzt!SQL Trigger Vergangenheit Papier

b) Überwachungsdaten werden häufig durch Datenbankauslöser erfasst. (i) Was würde passieren, wenn der Auslöser ausgelöst wird? (ii) Diskutieren Sie, wie dies normale Datenbankoperationen beeinflussen kann.
(6 Punkte)

Command (as user SYS): 
SQL> CREATE OR REPLACE TRIGGER audit-table-DEPT AFTER 
    2 INSERT OR UPDATE OR DELETE ON DEPT FOR EACH ROW 
    3 declare 
    4 audit_data DEPT$audit%ROWTYPE; 
    5 begin 
    6  if inserting then audit_data.change_type := 'I'; 
    7  elsif updating then audit_data.change_type :='U'; 
    8  else audit_data.change_type := 'D'; 
    9  end if; 
10 
11  audit_data.changed_by := user; 
12  audit_data.changed_time := sysdate; 
13 
14  case audit_data.change_type 
15  when 'I' then 
16   audit_data.DEPTNO := :new.DEPTNO; 
17   audit_data.DNAME := :new.DNAME; 
18   audit_data.LOC := :new.LOC; 
19  else 
20   audit_data.DEPTNO := :old.DEPTNO; 
21   audit_data.DNAME := :old.DNAME; 
22   audit_data.LOC := :old.LOC; 
23  end case; 
24 
25  insert into DEPT$audit values audit_data; 
26 end; 
27/
Trigger created. 
+0

Können Sie klären, welchen Teil der Frage Sie nicht verstehen? Verstehst du überhaupt keine Auslöser? Kennst du die Triggersyntax nicht?Können Sie nicht erkennen, welche Wirkung dieser Auslöser insbesondere hat? –

+0

Ich verstehe, dass der Auslöser auf eine Einfügung ausgelöst wird, aktualisieren oder löschen in der Tabelle DEPT. Wenn es in die Tabelle eingefügt wird, dann tut es etwas, wenn es etwas aktualisiert, tut es etwas anderes, wenn etwas etwas anderes gelöscht wird, aber ich kann nicht herausfinden, was es tut. Von dem, was ich erfassen kann, wenn er es einfügt, verwendet das Zeichen I, um einige Daten zu ändern (wenn 'I' dann audit_data.DEPTNO: =: new.DEPTNO;) – user3357649

Antwort

1

Der Trigger fügt jedes Mal eine neue Zeile in eine Audit-Tabelle ein, wenn in die Tabelle DATA etwas eingefügt, gelöscht oder aktualisiert wird.

Zeile 4 deklariert eine neue Variable audit_data, die eine %ROWTYPE variable, dh es wird eine Zeile in einer Datenbanktabelle imitieren, anstatt den Weg nur einen einzigen Wert hält ein INT oder DOUBLE würde.

Die Zeilen 6-9 setzen den Wert audit_datachange_type Spalte. Wenn der Trigger aufgerufen wurde, weil wir eine Zeile in DATA einfügen, wird change_type auf den Wert I gesetzt. Wenn wir DATA aktualisieren, wird change_type auf U festgelegt. Ansonsten löschen wir von DATA und change_type wird auf gesetzt.

Linien 11 & 12 zwei weitere Spalten in audit_data. Das Feld changed_by entspricht dem Benutzer, der dieses Einfügen/Aktualisieren/Löschen durchführt, und change_time wird gleich der aktuellen Uhrzeit eingestellt.

Die Zeilen 14-23 setzen dann die letzten drei Felder von audit_data: DEPTNO, DNAME und LOC. Diese Felder haben entsprechende Felder in der ursprünglichen Tabelle DATA. Wenn wir eine neue Zeile in DATA einfügen (wir haben vorher change_type auf I gesetzt), dann sind die Werte unserer neuen audit_data Felder die neuen Werte, die in DATA eingefügt werden. Wenn wir Zeilen in DATA entweder aktualisieren oder löschen, setzen wir die Werte der neuen Felder audit_data stattdessen auf die alten Werte vor der Aktualisierung/vor dem Löschen von DATA.

Schließlich führt Zeile 25 die tatsächliche Einfügung in die Audit-Tabelle durch und fügt eine Zeile mit allen audit_data Werten ein, die wir gerade fertiggestellt haben.

+0

Danke! Für den zweiten Teil der Frage würde es sich nachteilig auf die Geschwindigkeit/Speicherung der Datenbank auswirken, da jedes Mal, wenn etwas eingefügt, aktualisiert oder gelöscht wird, Speicher und Verarbeitungsleistung zugewiesen werden müssen, um den Auslöser auszuführen? – user3357649

0

Wenn die Operation ein INSERT ist, nimmt der Trigger die Werte von die neu eingefügten Datensätze und speichert sie in DEPT$audit.

Wenn es nicht ein INSERT (das heißt der Betrieb UPDATE oder DELETE ist), dann wird der Trigger nimmt die alten Werte (die alten/aktuellen Werte aus den aktualisierten/gelöschten Zeilen) und wieder speichert sie in DEPT$audit.

Dies ist offenbar für Geschichte/Auditing-Zwecke getan.