PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

ट्रिगर त्रुटि पर रोलबैक लेनदेन

आपके ट्रिगर फ़ंक्शन के साथ कुछ समस्याएं:

  • उपयोग 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 ... . के साथ प्रयास . देखें:

उन्नत उपयोग:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:यदि मौजूद नहीं है तो तालिका बनाएं AS

  2. लोचदार बीनस्टॉक के लिए Postgres11 तैनात करें - /etc/redhat-release की आवश्यकता है

  3. Postgresql पर कैसल Activerecord त्रुटि "संबंध मौजूद नहीं है"?

  4. रिमोट मशीन पर डंप को पुनर्स्थापित करें

  5. postgresql में mmm yyyy प्रारूप में दिनांक