मैंने एक अधिक सामान्य, तालिका स्वतंत्र कार्य बनाया।
CREATE OR REPLACE FUNCTION keep_row_number_steady()
RETURNS TRIGGER AS
$body$
DECLARE
tab text;
keyfld text;
nritems INTEGER;
rnd DOUBLE PRECISION;
BEGIN
tab := TG_ARGV[0];
keyfld := TG_ARGV[1];
nritems := TG_ARGV[2];
rnd := TG_ARGV[3];
IF random() < rnd
THEN
EXECUTE(format('DELETE FROM %s WHERE %s < (SELECT %s FROM %s ORDER BY %s DESC LIMIT 1 OFFSET %s)', tab, keyfld, keyfld, tab, keyfld, nritems));
END IF;
RETURN NULL;
END;
$body$
LANGUAGE plpgsql;
CREATE TRIGGER log_table_keep_row_number_steady_trigger
AFTER INSERT ON log_table
FOR EACH STATEMENT EXECUTE PROCEDURE keep_row_number_steady('log_table', 'id', 1000, 0.1);
फ़ंक्शन 4 पैरामीटर लेता है:
- टैब: टेबल का नाम
- कीफल्ड: संख्यात्मक, प्रगतिशील कुंजी क्षेत्र
- nritems: बनाए रखने के लिए मदों की संख्या
- रैंड: यादृच्छिक संख्या, 0 से 1 तक; यह जितना बड़ा होगा, उतनी ही बार-बार तालिका साफ की जाएगी (0 = कभी नहीं, 1 = हमेशा, 0.1 = 10% बार)
इस तरह से आप एक ही फ़ंक्शन को कॉल करने के लिए कितने ट्रिगर बना सकते हैं।
उम्मीद है की यह मदद करेगा।