मैं एक समान प्रकार के सामान्य ट्रिगर कर रहा हूं। सबसे मुश्किल हिस्सा NEW
में मान प्रविष्टि प्राप्त करना है कॉलम नाम के आधार पर रिकॉर्ड करें।
मैं इसे निम्न तरीके से कर रहा हूं:
- रूपांतरित करें
NEW
सरणी में डेटा; attnum
ढूंढें स्तंभ का और इसे सरणी के लिए एक अनुक्रमणिका के रूप में उपयोग करें।
यह तरीका जब तक डेटा में कोई कॉमा नहीं है, तब तक काम करता है :( मैं अन्य तरीकों के बारे में नहीं जानता कि कैसे NEW
कन्वर्ट किया जाए या OLD
मूल्यों की सरणी में चर।
निम्नलिखित फ़ंक्शन मदद कर सकता है:
CREATE OR REPLACE FUNCTION impose_maximum() RETURNS trigger AS $impose_maximum$
DECLARE
_sql text;
_cnt int8;
_vals text[];
_anum int4;
_im record;
BEGIN
_vals := string_to_array(translate(trim(NEW::text), '()', ''), ',');
FOR _im IN SELECT * FROM imposed_maximums WHERE table_name = TG_TABLE_NAME LOOP
SELECT attnum INTO _anum FROM pg_catalog.pg_attribute a
JOIN pg_catalog.pg_class t ON t.oid = a.attrelid
WHERE t.relkind = 'r' AND t.relname = TG_TABLE_NAME
AND NOT a.attisdropped AND a.attname = _im.column_group;
_sql := 'SELECT count('||quote_ident(_im.column_count)||')'||
' FROM '||quote_ident(_im.table_name)||
' WHERE '||quote_ident(_im.column_group)||' = $1';
EXECUTE _sql INTO _cnt USING _vals[_anum];
IF _cnt > CAST(_im.max_size AS int8) THEN
RAISE EXCEPTION 'Maximum of % hit for column % in table %(%=%)',
_im.max_size, _im.column_count,
_im.table_name, _im.column_group, _vals[_anum];
END IF;
END LOOP;
RETURN NEW;
END; $impose_maximum$ LANGUAGE plpgsql;
यह फ़ंक्शन किसी दी गई तालिका के लिए परिभाषित सभी शर्तों की जांच करेगा।