14

学校を表す sqlite データベースのトリガーを作成しようとしています。このスキーマを持つ Administrators というテーブルがあります。

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 つだけであることを確認したい。考えられることはすべて試しましたが、トリガーのさまざまな場所でエラーが発生し続けています。私が試した最後のものは、「IF」の近くにエラーがあると言います

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

誰かが私が間違っていることを理解するのを手伝ってもらえますか? ありがとう!

4

2 に答える 2

27

トリガーのドキュメントを参照してください。トリガー内では、、、、およびステートメントのみSELECTを使用できます。INSERTUPDATEDELETE

エラーを発生させるには、RAISEa 内から関数を使用します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;

(s も確認する必要がありますUPDATE。)

于 2013-04-13T08:27:15.277 に答える