आपके ट्रिगर फ़ंक्शन के साथ कुछ समस्याएं:
-
उपयोग
IF EXISTS (...) THEN
सभी घटनाओं को गिनने के बजाय। तेज, सरल। देखें: -
एक ट्रिगर फ़ंक्शन
AFTER
INSERT OR UPDATE
बसNULL
लौटा सकते हैं .RETURN NEW
केवलBEFORE
called नामक ट्रिगर के लिए प्रासंगिक है . मैनुअल : -
असंतुलित एकल उद्धरण।
-
जैसा कि @Pavel ने समझाया , आप plpgsql फ़ंक्शन के भीतर से लेनदेन को नियंत्रित नहीं कर सकते। कोई भी हैंडल न किया गया अपवाद आपके पूरे लेन-देन को स्वचालित रूप से वापस ले जाने के लिए बाध्य करता है। तो, बस
EXCEPTION
को हटा दें ब्लॉक करें।
आपका काल्पनिक ट्रिगर फिर से लिखा गया:
CREATE OR REPLACE FUNCTION check_room()
RETURNS TRIGGER AS
$func$
BEGIN
IF EXISTS (
SELECT FROM "Sesion" -- are you sure it's not "Session"?
WHERE "Room_Name" = NEW."Room_Name"
AND "Date" = NEW."Date") THEN
RAISE EXCEPTION 'The room is rented at that date';
END IF;
RETURN NULL;
END
$func$ LANGUAGE plpgsql;
ए BEFORE
ट्रिगर अधिक समझ में आता है।
लेकिन a UNIQUE INDEX ON ("Room_Name", "Date")
वही करेंगे, अधिक कुशलता से। फिर, उल्लंघन में कोई भी पंक्ति एक डुप्लिकेट कुंजी अपवाद उठाती है और लेन-देन को वापस ले लेती है (जब तक कि पकड़ा और संभाला नहीं जाता)। आधुनिक पोस्टग्रेज में आप वैकल्पिक रूप से ऐसे INSERT
. को स्किप या डायवर्ट कर सकते हैं INSERT ... ON CONFLICT ...
. के साथ प्रयास . देखें:
उन्नत उपयोग: