2013-04-13 11 views
12

Próbuję zrobić wyzwalacz dla bazy danych sqlite, która reprezentuje szkołę. Mam tabelę o nazwie Administratorzy z tym schematem:Utwórz wyzwalacz dla bazy danych sqlite, która zapobiega wstawianiu

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

Chcę się upewnić, że istnieje tylko jeden główny. Próbowałem wszystkiego, co mogę wymyślić i ciągle dostaję błędy w różnych lokalizacjach w wyzwalaczu. Ostatni, którego próbowałem, mówi, że jest błąd w pobliżu "JEŻELI"

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

Czy ktoś mógłby mi pomóc zrozumieć, co robię źle? Dzięki!

+1

Numery SSN i ​​numery telefonów nie mają wartości numerycznej; użyj ciągów. –

Odpowiedz

24

Zobacz trigger documentation; można używać tylko instrukcji SELECT, INSERT, UPDATE i DELETE wewnątrz wyzwalacza.

Aby podnieść błędy, należy użyć funkcji RAISE od wewnątrz SELECT: (. Należy również sprawdzić UPDATE s)

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; 

0

Łatwym sposobem jest to, że można mieć najpierw sprawdzić bazę danych jeśli istnieje dowolny podmiot główny, a następnie wykonaj niezbędne czynności, pisanie wyzwalacza dla tak trywialnego zadania to przesada

+3

A następnie napotkasz problemy współbieżności. Musisz też pamiętać, że musisz sprawdzać taki stan za każdym razem, gdy chcesz coś wstawić. –