त्रुटि संदेश है
आपके पास दो EXECUTE
हैं आदेश:
_query := 'CREATE TABLE public.'
|| quote_ident(_table_name) || ' ( ) INHERITS (public.evidence)';
EXECUTE _query;
...
EXECUTE 'INSERT INTO public.'
|| quote_ident(_table_name) || ' VALUES ($1.*)' USING NEW;
एकमात्र भाग जो NULL
हो सकता है है table_name
.table_name
. के लिए एकमात्र मौका बनने के लिए NULL
यहाँ है:
SELECT raised_local_time FROM notifications WHERE id=_notification_id
INTO _raised_local_time;
तो कारण दो कारणों में से एक होना चाहिए :
-
NEW.notification_id
हैNULL
। -
notifications
में कोई पंक्ति नहीं है दिए गएNEW.notification_id
. के लिए ।
यह डिबगिंग के लिए संशोधित ट्रिगर फ़ंक्शन आज़माएं :
CREATE OR REPLACE FUNCTION partition_evidence_by_month()
RETURNS trigger AS
$func$
DECLARE
_table_name text;
BEGIN
SELECT 'evidence-' || to_char(raised_local_time, 'YYYY-MM')
FROM public.notifications -- schema-qualify to be sure
WHERE id = NEW.notification_id
INTO _table_name;
IF _table_name IS NULL THEN
RAISE EXCEPTION '_table_name is NULL. Should not occur!';
END IF;
IF NOT EXISTS ( -- create table if it does not exist
SELECT 1
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'r'
AND c.relname = _table_name
AND n.nspname = 'public') THEN
EXECUTE 'CREATE TABLE public.'
|| quote_ident(_table_name) || ' ( ) INHERITS (public.evidence)';
END IF;
EXECUTE 'INSERT INTO public.'
|| quote_ident(_table_name) || ' VALUES $1' -- Use NEW row directly
USING NEW; -- write data to the partition table
RETURN NULL;
END
$func$ LANGUAGE plpgsql;
-
अप्रयुक्त चर निकालें और कोड को सरल बनाएं। (यह स्पष्ट रूप से एक सरलीकृत उदाहरण है।)
-
अन्य बातों के अलावा, आपको
date_trunc()
की आवश्यकता नहीं है बिल्कुल भी। बस मूल टाइमस्टैम्प कोto_char()
. पर फीड करें । -
varchar(n)
. का उपयोग करने का कोई मतलब नहीं है . बसtext
का उपयोग करें याvarchar
। -
पीएल/पीजीएसक्यूएल में बहुत अधिक असाइनमेंट से बचें जहां अनावश्यक - तुलनात्मक रूप से महंगा हो।
-
-
एक
RAISE
जोड़ें मेरी परिकल्पना की जाँच करने के लिए।
यदि आपको त्रुटि संदेश मिलता है, तो दो संभावित कारणों के बीच भेदभाव करना अगला कदम होगा। तुच्छ होना चाहिए...