2013-04-13 13 views
12

私は学校を表す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) 
); 

私は、1つのプリンシパルしか存在しないようにしたいと考えています。私は考えることができるすべてを試してきましたが、トリガーのさまざまな場所でエラーが発生し続けます。私が試した最後のものは

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

は、誰も私が把握助けてくださいでした「IF」私が間違って何をやってるの近くに誤りがあると言いますか? ありがとう!

+1

SSNと電話番号には数値がありません。文字列を使用します。 –

答えて

24

trigger documentationを参照してください。トリガー内でSELECT,INSERTUPDATE、およびDELETEステートメントのみを使用できます。

SELECT内部からRAISE機能を使用し、エラーを発生させるために、:(。あなたはまた、UPDATE秒をチェックする必要があります)

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

簡単な方法は、データベースを最初に確認するかもしれないということですプリンシパルの誰かが存在する場合、必要なアクションを実行します。

このような簡単なタスクのトリガを書くことは、過剰殺到です

+3

その後、並行性の問題が発生します。また、何かを挿入するたびにそのような状態をチェックしなければならないことを覚えておく必要があります。 –

関連する問題