2013-04-13 29 views
12

Tôi đang cố kích hoạt cơ sở dữ liệu sqlite đại diện cho một trường học. Tôi có một bảng được gọi là Quản trị viên với giản đồ này:Tạo trình kích hoạt cho cơ sở dữ liệu sqlite ngăn chặn chèn

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

Tôi muốn đảm bảo rằng chỉ có một hiệu trưởng. Tôi đã thử tất cả mọi thứ tôi có thể nghĩ và tôi tiếp tục nhận được lỗi tại các địa điểm khác nhau trong kích hoạt. Người cuối cùng tôi đã thử nói rằng có lỗi gần "NẾU"

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

Có ai vui lòng giúp tôi tìm ra những gì tôi đang làm sai không? Cảm ơn!

+1

Số SSN và số điện thoại không có giá trị số; sử dụng chuỗi. –

Trả lời

24

Xem trigger documentation; bạn chỉ có thể sử dụng các câu lệnh SELECT, INSERT, UPDATEDELETE bên trong trình kích hoạt.

Nâng lỗi, sử dụng RAISE chức năng từ bên trong một SELECT: (. Bạn cũng cần phải kiểm tra 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

Một cách dễ dàng là bạn có thể có đầu tiên kiểm tra các cơ sở dữ liệu nếu bất kỳ ai là hiệu trưởng tồn tại, sau đó thực hiện hành động cần thiết

viết trình kích hoạt cho nhiệm vụ tầm thường đó là quá mức cần thiết

+3

Và sau đó chạy vào các vấn đề tương tranh. Ngoài ra, bạn phải nhớ rằng bạn phải kiểm tra tình trạng như vậy mỗi khi bạn muốn chèn một cái gì đó. –

Các vấn đề liên quan