में ट्रैक संशोधन में मुझे एक तालिका में रिकॉर्ड्स के संशोधन का ट्रैक रखना होगा। मैंने जो किया है वह दूसरी तालिका बनाता है जो पहले से विरासत में आता है और एक संशोधन काउंटर जोड़ता है।पोस्टग्रेस्क्ल
CREATE TABLE A (
id SERIAL,
foo TEXT,
PRIMARY KEY (id));
CREATE TABLE B (
revision INTEGER NOT NULL) INHERITS (A);
फिर मैंने एक ट्रिगर बनाया जो प्रत्येक बार ए को डाला/अपडेट किया गया है। मैं यह नहीं समझ सकता कि बीआरविजन को प्रत्येक आईडी के लिए एक व्यक्तिगत "अनुक्रम" कैसे बनाए रखना है।
उदाहरण: तालिका ए में 2 पंक्तियां हैं, i & जे।
मुझे 3 बार अपडेट किया गया है और इसमें 3 संशोधन होना चाहिए: (1, 2, 3)।
जे 2 बार अपडेट किया गया है और इसमें दो संशोधन होना चाहिए: (1, 2)।
यहां तक कि मेरे पास अभी तक क्या है, शायद मैं गलत पथ पर जा रहा हूं और कोई मेरी मदद कर सकता है!
CREATE OR REPLACE FUNCTION table_update() RETURNS TRIGGER AS $table_update$
DECLARE
last_revision INTEGER;
BEGIN
SELECT INTO last_revision coalesce(MAX(revision), 0) FROM B WHERE id = NEW.id;
INSERT INTO B SELECT NEW.*, last_revision + 1;
RETURN NEW;
END;
$table_update$ LANGUAGE plpgsql;
मैं बदल एक सम्मिलित में "अगर नहीं मिला", कि "0" ले जाएगा अगर कोई मौजूदा संशोधन है:
CREATE OR REPLACE FUNCTION table_update() RETURNS TRIGGER AS $table_update$
DECLARE
last_revision INTEGER;
BEGIN
SELECT INTO last_revision MAX(revision) FROM B WHERE id = NEW.id;
IF NOT FOUND THEN
last_revision := 0;
END IF;
INSERT INTO B SELECT NEW.*;
RETURN NEW;
END;
$table_update$ LANGUAGE plpgsql;
CREATE TRIGGER table_update
AFTER INSERT OR UPDATE ON A
FOR EACH ROW EXECUTE PROCEDURE table_update();
यह बहुत समझ में आता है। यह सबसे अच्छा होगा कि ओपी इसके लिए जगह बनाने के लिए अपनी आवश्यकताओं को बदलता है, क्योंकि अन्य बातों के अनुसार आपको लॉकिंग की आवश्यकता होगी। –
एचआरएम। और मैंने अभी देखा है कि यह वास्तविक संशोधन जानकारी नहीं दिखाता है। मैंने आर 1 पर "बार" के रूप में रिकॉर्ड डाला और इसे "आप" के रूप में आर 3 में अपडेट किया, लेकिन उस अंतिम क्वेरी के परिणाम दोनों संशोधनों के लिए "आप" दिखाते हैं। इसे ठीक करने के लिए, बी को ए से प्राप्त नहीं होना चाहिए। उन्हें 'इनहेरिट्स' के बजाय 'LIKE' का उपयोग करने के लिए उन्हें उपयोग करना चाहिए: 'तालिका बी बनाएं (जैसे ए, पुनरीक्षण धारावाहिक न्यूल);'। – theory
या "केवल" कीवर्ड का उपयोग करें। लेकिन हाँ, अलग टेबल का उपयोग करने के लिए यह कम भ्रमित हो सकता है। –