एक ट्रिगर फ़ंक्शन लिखें। कुछ इस तरह:
CREATE OR REPLACE FUNCTION trg_backup_row()
RETURNS trigger AS
$BODY$
BEGIN
INSERT INTO other_tbl
SELECT (OLD).*, t.other_col -- all columns of from old table
-- SELECT OLD.col1, OLD.col2, t.other_col -- alternative: some cols from old tbl
FROM third_tbl t
WHERE t.col = OLD.col -- link to third table with info from deleted row
AND <unique_condition_to_avoid_multiple_rows_if_needed>;
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
और एक ट्रिगर ON DELETE
. इस तरह:
CREATE TRIGGER delaft
AFTER DELETE
ON tbl
FOR EACH ROW
EXECUTE PROCEDURE trg_backup_row();
मुख्य तत्व
-
इसे ट्रिगर
डिलीट करने के बाद
सबसे अच्छा बनाएं औरप्रत्येक पंक्ति के लिए
। -
पुरानी तालिका से सभी कॉलम वापस करने के लिए सिंटैक्स का उपयोग करें
(OLD).*
. समग्र प्रकारों को एक्सेस करने के बारे में मैनुअल देखें . वैकल्पिक रूप सेपुराना।*
मान्य सिंटैक्स भी है, क्योंकिपुराना
FROM
. में जोड़ा जाता है स्पष्ट रूप से खंड।VALUES
. के लिए व्यंजक यह(OLD) होना चाहिए।*
, यद्यपि। पसंद:INSERT INTO other_tbl VALUES((OLD).*, some_variable)
-
आप किसी अन्य तालिका से मान शामिल कर सकते हैं जैसे मैं प्रदर्शित करता हूं। बस एक पंक्ति प्राप्त करना सुनिश्चित करें, या आप कई प्रविष्टियाँ बनाते हैं।
-
जैसे ही ट्रिगर सक्रिय होता है
बाद
घटना, फ़ंक्शनरिटर्न NULL
कर सकता है ।
दृश्यता के बारे में
@couling की सतर्क टिप्पणी के जवाब में।
जबकि विदेशी कुंजियों को DEFERREDके रूप में घोषित किया जा सकता है। कोड>
, यह केवल सत्यनिष्ठा जांच को स्थगित करेगा, स्वयं विलोपन को नहीं। पंक्तियाँ जो ट्रिगर में हटा दी जाती हैं, जो हाथ में एक से पहले निष्पादित होती हैं या डिलीट कैस्केड पर
. द्वारा विदेशी कुंजियाँ अब और दिखाई नहीं देंगी उस समय यह हटाने के बाद
ट्रिगर कहा जाता है। (यह सब स्पष्ट रूप से एक लेन-देन में होता है। इनमें से कोई भी विवरण अन्य लेनदेन के लिए मायने नहीं रखता है, जो सभी या कोई भी प्रभाव नहीं देखेगा। एमवीसीसी मॉडल और लेनदेन अलगाव
।)
इसलिए, यदि आप अपने INSERT
. में इस तरह के आधार पर पंक्तियों से मान शामिल करना चाहते हैं , इस ट्रिगर को पहले . कॉल करना सुनिश्चित करें वे पंक्तियाँ हटा दी जाती हैं।
हटाने से पहले
. आपको यह ट्रिगर करना पड़ सकता है ।
या इसका मतलब यह हो सकता है कि आपको अपने ट्रिगर्स को उसी के अनुसार ऑर्डर करना होगा, पहले
ट्रिगर बाद
. से पहले आते हैं ट्रिगर, जाहिर है। और समान स्तर पर ट्रिगर वर्णमाला क्रम
में क्रियान्वित किए जाते हैं ।
हालांकि, जब तक मैं यहां बहुत सटीक हूं, मैं पंक्ति में किए गए परिवर्तनों (या पंक्तियों के आधार पर) को अन्य पहले
में भी जोड़ सकता हूं ट्रिगर भी केवल तभी दिखाई देते हैं जब उन्हें पहले . कहा जाता है यह वाला।
मेरी सलाह है कि इसे बाद
बनाएं ट्रिगर इसलिए था क्योंकि यह जटिलताओं के लिए कम प्रवण होता है और सस्ता होता है यदि अन्य ट्रिगर DELETE
को रद्द (रोल बैक) कर सकता है ऑपरेशन के आधे रास्ते - जब तक उपरोक्त में से कोई भी लागू नहीं होता है।