2009-08-24 12 views
2

kann mir jemand helfen, einen Auslöser zu schreiben, um bestimmte Einträge in eine Tabelle zu verbieten (für zB location = 'chicago' nicht erlaubt) .Das Schema der Tabelle ist wie folgt Abteilung (Deptno, Deptname, Standort). Ich benutze Orakel 10g.vor INSERT oder Update-Trigger plsql

+1

Dies ist eine leicht mit einer gespeicherten Prozedur erreicht werden, aber ich bin nicht sicher, ob ich ihn dort würde entweder (es sei denn, Sie haben Entwickler arbeiten direkt in Ihrer Datenbank und Sie möchten sie begrenzen, nicht zu wahrscheinlich), diese Art von Geschäftsbeschränkungen sind in der Regel in Code, viele Schichten über der Datenbank durchgeführt. Natürlich weiß ich nichts über Ihren Code oder Ihr Design, nur einen Kommentar ... – Kobi

Antwort

11

Mit CHECK CONSTRAINT auf Ihrer Spalte können Sie leicht machen, was Sie wollen.

ALTER TABLE T 
ADD CONSTRAINT constraint_name CHECK (location <> 'chicago') [DISABLE]; 

Das Schlüsselwort DISABLE ist optional. Wenn Sie eine Prüfbedingung mit dem Schlüsselwort DISABLE erstellen, wird die Bedingung erstellt, , aber die Bedingung wird nicht erzwungen.

Constraint Staaten

  • ENABLE - sicherzustellen, dass alle eingehenden Daten die Einschränkung entsprechen
  • DISABLE - erlauben eingehende Daten, unabhängig davon, ob es entspricht die Einschränkung
  • VALIDATE - sicherstellen, dass die vorhandenen Daten mit dem Con entsprechen Straint
  • NOVALIDATE - vorhandene Daten muss nicht

Diese der Einschränkung entsprechen, können

ENABLE {[Standard] VALIDATE in Kombination miteinander verwendet werden | NOVALIDATE}

DISABLE {VALIDATE | [Standard] NOVALIDATE}

  • VALIDATE ENABLE ist die gleiche wie ENABLE.

  • AKTIVIEREN NOVALIDATE bedeutet, dass die Einschränkung geprüft wird, sie muss jedoch nicht für alle Zeilen gelten. Dies setzt die Prüfung der Einschränkung auf deaktivierte Bedingungen fort, ohne zuerst alle Daten in der Tabelle zu validieren.

  • DISABLE NOVALIDATE ist das gleiche wie DISABLE.

  • DISABLE VALIDATE deaktiviert die Abhängigkeit, lässt den Index für die Abhängigkeit fallen und erlaubt keine Änderung der eingeschränkten Spalten. für eine UNIQUE-Einschränkung ermöglicht dies das Laden von Daten aus einer nicht partitionierten Tabelle in eine partitionierte Tabelle mit der Klausel ALTER TABLE .. EXCHANGE PARTITION.

Hier ist ein Beispiel für BEFORE INSERT-Trigger. Es ist jedoch besser, Einschränkungen für Ihr Schema zu erstellen oder CUSTOM_INSERT PROCEDURE zu implementieren, um es zu filtern. Here ist ein guter Artikel über Data Integrity - Constraints und Trigger.

Trigger sollte nicht verwendet werden Geschäftsregeln zu erzwingen oder Integritätsregeln referentielle, die mit einfachen Einschränkungen umgesetzt werden könnten.

Beispiel Trigger (betrachtet es als eine schlechte Idee für die Filterung Eingang):

CREATE TRIGGER myTrigger 
BEFORE INSERT 
ON table 
REFERENCING NEW AS New 
FOR EACH ROW 
    BEGIN 
    IF (New.location = 'chicago') THEN 
     RAISE cError;  
EXCEPTION 
WHEN cError THEN 
     RAISE_APPLICATION_EXCEPTION(-20001,'Chicago is not allowed'); 
END; 
+0

Anstelle von DELETE sollte RAISE_APPLICATION_ERROR (-20000, 'No Chicago, bitte!'); – jva

+0

Die ganze Trigger-Sache wird überhaupt nicht benötigt. Und in meinem Beispiel (schlechtem) ist der Trigger nach ... –

+1

Der Nachteil eines Triggers ist, dass Sie die Anweisung nicht erfüllen können. Mit einer Prüfbeschränkung hat der Entwickler die Möglichkeit, eine LOG ERRORS-Klausel zu verwenden, damit gültige Daten eingefügt werden und die ungültigen Daten in eine Ausnahmetabelle eingefügt werden. Sehr nützlich für Massenladevorgänge. –