2016-04-05 12 views
-1

Ich erstelle einige Trigger für eine SQL-Datenbank. Ich habe erfolgreich zwei Trigger erstellt, die ein INSERT mit SYSDATE vergleichen. Für diese dritte versuche ich sicherzustellen, dass ein eingefügter Wert nicht größer als 10 ist. Unten ist der Trigger und die Testdaten, um es auszuführen. Ich glaube, das Problem hat etwas damit zu tun, die Bewertung zu bewerten.Erstellen eines SQL-Triggers mit einer Zahlenvariablen

CREATE OR REPLACE TRIGGER trig_rating_ck 
BEFORE INSERT OR UPDATE OF rating ON reviews 
FOR EACH ROW 

BEGIN 
IF (NEW.rating > 10) THEN 
RAISE_APPLICATION_ERROR(-20000, 'Rating has to be between 1 and 10'); 
END IF; 
END trig_rating_ck; 
/

--TEST DATA 
INSERT INTO reviews (review_id, reviewer_id, venue_id, description, rating, date_posted) 
VALUES (seq_reviews.NEXTVAL, 10000,10000, 'THIS WAS GREAT', '11', '06-APR-2016'); 
+1

Was ist der Fehler, den Sie erhalten? – bassrek

+2

Ich würde vermuten, dass Sie einen Fehler bekommen, wenn Sie den Trigger erstellen, weil Sie einen Doppelpunkt vor 'new' in' if (: new.rating> 10) 'setzen müssen. Möglicherweise erhalten Sie einen Fehler beim Ausführen der Anweisung 'insert', da Sie versuchen, eine Zeichenfolge in eine Datumsspalte einzufügen, anstatt ein Datumsliteral oder ein explizites 'to_date' zu ​​verwenden. –

Antwort

4

Sie sollten deklarative Constraints für etwas wie diese, anstatt Trigger verwenden. Ich habe in ein paar Jahren nicht mit Oracle zusammengearbeitet, aber SQL Server-Trigger können große Auswirkungen auf die Performance haben, ganz zu schweigen davon, dass sie eher Fehler verursachen oder Dinge passieren lassen.

Für diesen speziellen Fall können Sie einfach verwenden:

CONSTRAINT CHK_Reviews_rating CHECK (rating BETWEEN 0 AND 10) 

Das ist nur ein Teil Ihrer Tabellendeklaration sein würde.

Auslöser können auch versteckte Geschäftslogik verursachen, was eine schlechte Idee ist.

Ich weiß nicht, ob Sie den Fehler in diesen Situationen anpassen können, aber Ihre Anwendung sollte in der Lage sein, den Fehler zu sehen und entsprechend zu behandeln.

Verwandte Themen