Erstellen Sie einen Trigger für die SQLite-database, die das Einfügen verhindert

Ich versuche, einen Auslöser für eine SQLite-database zu machen, die eine Schule darstellt. Ich habe eine Tabelle namens Administratoren mit diesem Schema:

CREATE TABLE Administrators( ssn INT CHECK(ssn > 100000000), lName CHAR(20), fName CHAR(10), gender CHAR(1) CHECK(gender IN('F','M')), dob DATE, address CHAR(100), phone INT CHECK(phone > 1000000000), role CHAR(20) CHECK(role IN('Principal','Vice Principal','Dean')), PRIMARY KEY(ssn) ); 

Ich möchte sicherstellen, dass es nur einen Auftraggeber gibt. Ich habe alles versucht, was mir einfällt, und bekomme immer wieder Fehler an verschiedenen Stellen im Auslöser. Die letzte, die ich ausprobiert habe, sagt, dass es einen Fehler in der Nähe von "IF" gibt

 sqlite> CREATE TRIGGER onePres ...> BEFORE INSERT ON Administrators ...> BEGIN ...> IF (EXISTS (SELECT * FROM Administration WHERE role = 'Principal')) ...> BEGIN ...> ROLLBACK TRANSACTION; ...> RETURN ...> END; ...> END; 

Könnte mir bitte jemand helfen, herauszufinden, was ich falsch mache? Vielen Dank!

Solutions Collecting From Web of "Erstellen Sie einen Trigger für die SQLite-database, die das Einfügen verhindert"

Siehe die Trigger-Dokumentation ; Sie können nur SELECT , INSERT , UPDATE und DELETE statementen innerhalb eines Triggers verwenden.

Um Fehler zu RAISE , verwenden Sie die RAISE function innerhalb eines SELECT :

 CREATE TRIGGER onePres BEFORE INSERT ON Administrators FOR EACH ROW WHEN NEW.role = 'Principal' BEGIN SELECT RAISE(ABORT, 'There can be only one.') WHERE EXISTS (SELECT 1 FROM Administrators WHERE role = 'Principal'); END; 

(Sie müssen auch UPDATE s überprüfen.)

Eine einfache Möglichkeit besteht darin, dass Sie zuerst die database überprüfen können, wenn jemand existiert, der ein Principal ist, und dann die notwendigen Aktionen ausführen

Einen Auslöser für solch eine triviale Aufgabe zu schreiben ist ein Overkill