(नोट:। नीचे अपनाया जवाब के साथ अद्यतन)PostgreSQL: अद्यतन विभाजन भर में इस कदम का तात्पर्य
एक PostgreSQL 8.1 (या बाद में) विभाजित तालिका के लिए, कैसे एक एक UPDATE
ट्रिगर और प्रक्रिया के लिए "चाल" को परिभाषित करता है एक विभाजन से दूसरी तरफ एक रिकॉर्ड, यदि UPDATE
विभाजन खंड में परिवर्तन को परिभाषित करता है जो विभाजन पृथक्करण को परिभाषित करता है?
create table RECORDS (RECORD varchar(64) not null, ACTIVE boolean default true);
create table ACTIVE_RECORDS (check (ACTIVE)) inherits RECORDS;
create table INACTIVE_RECORDS (check (not ACTIVE)) inherits RECORDS;
INSERT
ट्रिगर और समारोह काम अच्छी तरह से: नई सक्रिय रिकॉर्ड एक तालिका में डाल दिया हो, और नए निष्क्रिय रिकॉर्ड
उदाहरण के लिए, मैं एक मेज रिकॉर्ड तो जैसे सक्रिय और निष्क्रिय रिकॉर्ड में विभाजित है दूसरे में। मैं UPDATE
एस को सक्रिय क्षेत्र में एक एक वंशज से दूसरे में एक रिकॉर्ड को "स्थानांतरित" करने के लिए चाहता हूं, लेकिन मुझे एक त्रुटि आ रही है जो बताती है कि यह संभव नहीं हो सकता है।
उत्प्रेरक विनिर्देश और त्रुटि संदेश:
pg=> CREATE OR REPLACE FUNCTION record_update()
RETURNS TRIGGER AS $$
BEGIN
IF (NEW.active = OLD.active) THEN
RETURN NEW;
ELSIF (NEW.active) THEN
INSERT INTO active_records VALUES (NEW.*);
DELETE FROM inactive_records WHERE record = NEW.record;
ELSE
INSERT INTO inactive_records VALUES (NEW.*);
DELETE FROM active_records WHERE record = NEW.record;
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
pg=> CREATE TRIGGER record_update_trigger
BEFORE UPDATE ON records
FOR EACH ROW EXECUTE PROCEDURE record_update();
pg=> select * from RECORDS;
record | active
--------+--------
foo | t -- 'foo' record actually in table ACTIVE_RECORDS
bar | f -- 'bar' record actually in table INACTIVE_RECORDS
(2 rows)
pg=> update RECORDS set ACTIVE = false where RECORD = 'foo';
ERROR: new row for relation "active_records" violates check constraint "active_records_active_check"
ट्रिगर प्रक्रिया के साथ बजाना (लौटने शून्य और आगे) मेरे लिए पता चलता है कि बाधा चेक किया गया है, और त्रुटि, उठाया से पहले अपने ट्रिगर शुरू हो जाती है, जिसका अर्थ है कि मेरा वर्तमान दृष्टिकोण काम नहीं करेगा। क्या यह काम करने के लिए मिल सकता है?
अद्यतन/उत्तर
नीचे UPDATE
ट्रिगर प्रक्रिया मैं का उपयोग कर, विभाजन को दिए गये उसी प्रक्रिया समाप्त हो गया है। क्रेडिट Bell को पूरी तरह से है, जिसका जवाब मुझे कुंजी जानकारी दी विभाजन पर ट्रिगर:
CREATE OR REPLACE FUNCTION record_update()
RETURNS TRIGGER AS $$
BEGIN
IF ((TG_TABLE_NAME = 'active_records' AND NOT NEW.active)
OR
(TG_TABLE_NAME = 'inactive_records' AND NEW.active)) THEN
DELETE FROM records WHERE record = NEW.record;
INSERT INTO records VALUES (NEW.*);
RETURN NULL;
END IF;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
आपका "उदाहरण" अधूरा है: "partitioned_records" के लिए परिभाषा लापता; आप "partitioned_records" के लिए एक ट्रिगर परिभाषित करते हैं लेकिन "रिकॉर्ड्स" से चुनें और अपडेट करें। –
@ मिलन, धन्यवाद - कट'नपेस्ट त्रुटियां। उपाय करेंगे – pilcrow
जब आप आंशिक अनुक्रमणिका का उपयोग कर सकते हैं तो इस संदर्भ में विभाजन का उपयोग करने का क्या मतलब है? – kalu