Создать триггер для базы данных 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
Простым способом является то, что вы могли бы сначала проверить базу данных, если существует тот, кто является основным, а затем выполнить необходимое действие
запись триггера для такой тривиальной задачи - перебор