# SQL TRIGGER aktuelles Datum prüfen



## g4da (1. Mai 2011)

Hallo liebe Community,

ich möchte meiner Tabelle einen Trigger implementieren.. Es dürfen keine Autos in die Datenbank eingefügt werden, die eine abgelaufende HU haben!

CREATE TRIGGER HU_TEST
BEFORE
INSERT 
ON Kraftfahrzeuge

IF (new.Datum>'01.05.2011')
THEN
RAISE_APPLICATION_ERROR(-121212, 'Datum muss nach dem akt. sein');
ELSE
DBMS_OUTPUT.PUT_LINE('Datensatz eingefuegt!');
END IF;
END;

Hat jemand ne Idee, was falsch ist?

Viele Grüße & vielen Dank,

g4da


----------



## CPoly (1. Mai 2011)

Wäre ganz praktisch zu wissen
1. Das Datenbank-System (ich rate mal Oracle)
2. Die Fehlermeldung****?

Was soll denn "new" sein?  Falls das eine Referenz auf den gerade betrachteten Datensatz sein soll, musst du das auch irgendwo bekanntmachen.


```
CREATE TRIGGER HU_TEST
BEFORE INSERT ON Kraftfahrzeuge
REFERENCING NEW AS new
FOR EACH ROW
BEGIN
	IF (new.Datum<sysdate) THEN
		RAISE_APPLICATION_ERROR(-121212, 'Datum muss nach dem akt. sein');
	ELSE
		DBMS_OUTPUT.PUT_LINE('Datensatz eingefuegt!');
	END IF;
END;
```

Edit: Hast du nicht auch die Prüfung falsch herum? Wenn das Datum VOR heute liegt, ist es ja gültig und noch nicht abgelaufen.


----------



## g4da (1. Mai 2011)

Ja es ist Oracle.

Fehler ist ORA-04079: Ungültige Trigger-Angabe!

Stimm das < ist falsch!


----------



## g4da (1. Mai 2011)

Hab noch den Fehler:

FEHLER bei Zeile 2: PLS-00201: Bezeichner 'NEW.Datum muss deklariert werden.

Woran kann das liegen?


----------



## MPr (2. Mai 2011)

wenn's sich um Oracle 11 handeln sollte, würde ich statt eines Triggers eher einen Constraint mit einer virtuellen Spalte verwenden, wie das Rob van Wijk in seinem Blog zeigt: http://rwijk.blogspot.com/2007/12/check-constraints-with-sysdate.html. Dort ist auch noch ein weiterer Artikel des Herrn van Wijk verlinkt, in dem er diverse Gründe dafür aufführt, warum Trigger schwarze Magie sind (was auch Tom Kyte regelmäßig betont).

Gruß

MP


----------



## MPr (2. Mai 2011)

wenn's nicht Oracle 11 sein sollte: ein Beispiel, wie man einen solchen Trigger formuliert, liefert die PSOUG-Referenz: http://psoug.org/reference/table_trigger.html unter "Trigger Enforcing Integrity Constraint":

```
CREATE OR REPLACE TRIGGER t_date
BEFORE INSERT
ON orders
FOR EACH ROW

DECLARE
 bad_date EXCEPTION;
BEGIN
  IF :new.datecol > SYSDATE THEN
    RAISE_APPLICATION_ERROR(-20005,'Future Dates Not Allowed');
  END IF;
END;
/
```


----------

