Как я указал в комментарии к ответу Эрвина Брандштеттера , изначально у меня было почти идентичное решение.
Но проблема заключалась в том, что я получал ошибку
ERROR: record "new" has no field "column_name"
CONTEXT: SQL statement "SELECT validate_bid_modifiers_count(table_name, column_name, NEW.column_name, devices_count)"
PL/pgSQL function device_bid_modifiers_count_per() line 15 at PERFORM
Вот почему я подумал, что мне нужен способ для динамической оценки вещей.
В настоящее время это работает со следующим все еще уродливым решением (уродливым, потому что мне не нравятся 2 IF
утверждения,Мне бы хотелось, чтобы он был супер-динамичным, но, возможно, я слишком многого прошу):
CREATE OR REPLACE FUNCTION device_bid_modifiers_count_per()
RETURNS TRIGGER AS
$func$
DECLARE
row RECORD;
table_name regclass := TG_ARGV[0];
column_name text := TG_ARGV[1];
devices_count INTEGER;
BEGIN
LOCK TABLE device_types IN EXCLUSIVE MODE;
EXECUTE format('LOCK TABLE %s IN EXCLUSIVE MODE', table_name);
devices_count := device_types_count();
IF TG_OP = 'DELETE' THEN
row := OLD;
ELSE
row := NEW;
END IF;
IF column_name = 'campaign_id' THEN
PERFORM validate_bid_modifiers_count(table_name, column_name, row.campaign_id, devices_count);
ELSIF column_name = 'adgroup_id' THEN
PERFORM validate_bid_modifiers_count(table_name, column_name, row.adgroup_id, devices_count);
ELSE
RAISE EXCEPTION 'invalid_column_name %', column_name;
END IF;
RETURN NEW;
END;
$func$ LANGUAGE plpgsql;
Я открыт для более надежных предложений решения.
По сути, второе условие вида 'Я почти отказался от цели иметь одну функцию, я мог бы на этом этапе разделить ее на две функции.Поскольку цель состоит в том, чтобы определить несколько (2) триггеров, используя эту функцию (предоставив ей аргументы).