2013-04-13 7 views
12

को रोकता है I एक स्कूल का प्रतिनिधित्व करने वाले स्क्लाइट डेटाबेस के लिए ट्रिगर करने का प्रयास कर रहा हूं। मेरे पास इस स्कीमा के साथ प्रशासक नामक एक टेबल है:एसक्लाइट डेटाबेस के लिए ट्रिगर बनाएं जो

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

मैं यह सुनिश्चित करना चाहता हूं कि केवल एक प्रिंसिपल है। मैंने जो कुछ भी सोच सकता हूं उसकी कोशिश की है और मुझे ट्रिगर में विभिन्न स्थानों पर त्रुटियां मिल रही हैं। आखिरी बार मैंने कोशिश की है कि "आईएफ"

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

क्या कोई मुझे यह जानने में मदद कर सकता है कि मैं क्या गलत कर रहा हूं? धन्यवाद!

+1

एसएसएन और फोन नंबरों के पास कोई संख्यात्मक मूल्य नहीं है; स्ट्रिंग का प्रयोग करें। –

उत्तर

24

trigger documentation देखें; आप केवल SELECT, INSERT, UPDATE, और 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

और फिर समवर्ती मुद्दों में भाग लें। साथ ही, आपको याद रखना होगा कि हर बार जब आप कुछ डालना चाहते हैं तो आपको ऐसी स्थिति जांचनी होगी। –

संबंधित मुद्दे