Создать триггер для базы данных sqlite, которая предотвращает вставку

Я пытаюсь создать триггер для базы данных sqlite, представляющей школу. У меня есть таблица под названием "Администраторы" с этой схемой:

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)
);

Я хочу убедиться, что существует только один принцип. Я пробовал все, что мог придумать, и я продолжаю получать ошибки в разных местах триггера. Последнее, что я пробовал, говорит о ошибке рядом с "IF"

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

Может ли кто-нибудь помочь мне выяснить, что я делаю неправильно? Спасибо!

Ответ 1

См. документацию ; вы можете использовать только триггеры SELECT, INSERT, UPDATE и DELETE внутри триггера.

Чтобы поднять ошибки, используйте функцию RAISE изнутри 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;

(Вам также нужно проверить UPDATE s.)

Ответ 2

Простым способом является то, что вы могли бы сначала проверить базу данных, если существует тот, кто является основным, а затем выполнить необходимое действие

запись триггера для такой тривиальной задачи - перебор