history_str CREATE TABLE lastvalue_str( itemid bigint primary key, clock integer NOT NULL DEFAULT 0, value character varying(255) NOT NULL DEFAULT ''::character varying); CREATE OR REPLACE FUNCTION lastvalue_str_func() RETURNS TRIGGER AS $BODY$ DECLARE BEGIN IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE' ) THEN INSERT INTO lastvalue_str(itemid, clock, value) VALUES(NEW.itemid, NEW.clock, NEW.value) ON CONFLICT (itemid) DO UPDATE SET clock = NEW.clock, value = NEW.value; END IF; RETURN NEW; END; $BODY$ LANGUAGE plpgsql; CREATE TRIGGER trigger_insert_lastvalue_str BEFORE INSERT OR UPDATE ON history_str FOR EACH ROW EXECUTE PROCEDURE lastvalue_str_func(); CREATE OR REPLACE FUNCTION lastvalue_str_func_delete() RETURNS TRIGGER AS $BODY$ DECLARE BEGIN IF (TG_OP = 'DELETE') THEN DELETE FROM lastvalue_str WHERE itemid = OLD.itemid; END IF; RETURN OLD; END; $BODY$ LANGUAGE plpgsql; CREATE TRIGGER trigger_delete_lastvalue_str BEFORE DELETE ON items FOR EACH ROW EXECUTE PROCEDURE lastvalue_str_func_delete(); ************************************************************************** history CREATE TABLE lastvalue( itemid bigint primary key, clock integer NOT NULL DEFAULT 0, value numeric(16,4) NOT NULL DEFAULT 0); CREATE OR REPLACE FUNCTION lastvalue_func() RETURNS TRIGGER AS $BODY$ DECLARE BEGIN IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE' ) THEN INSERT INTO lastvalue(itemid, clock, value) VALUES(NEW.itemid, NEW.clock, NEW.value) ON CONFLICT (itemid) DO UPDATE SET clock = NEW.clock, value = NEW.value; END IF; RETURN NEW; END; $BODY$ LANGUAGE plpgsql; CREATE TRIGGER trigger_insert_lastvalue BEFORE INSERT OR UPDATE ON history FOR EACH ROW EXECUTE PROCEDURE lastvalue_func(); CREATE OR REPLACE FUNCTION lastvalue_func_delete() RETURNS TRIGGER AS $BODY$ DECLARE BEGIN IF (TG_OP = 'DELETE') THEN DELETE FROM lastvalue WHERE itemid = OLD.itemid; END IF; RETURN OLD; END; $BODY$ LANGUAGE plpgsql; CREATE TRIGGER trigger_delete_lastvalue BEFORE DELETE ON items FOR EACH ROW EXECUTE PROCEDURE lastvalue_func_delete(); ************************************************************************** history_text CREATE TABLE lastvalue_text( itemid bigint primary key, clock integer NOT NULL DEFAULT 0, value text NOT NULL DEFAULT ''::text); CREATE OR REPLACE FUNCTION lastvalue_text_func() RETURNS TRIGGER AS $BODY$ DECLARE BEGIN IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE' ) THEN INSERT INTO lastvalue_text(itemid, clock, value) VALUES(NEW.itemid, NEW.clock, NEW.value) ON CONFLICT (itemid) DO UPDATE SET clock = NEW.clock, value = NEW.value; END IF; RETURN NEW; END; $BODY$ LANGUAGE plpgsql; CREATE TRIGGER trigger_insert_lastvalue_text BEFORE INSERT OR UPDATE ON history_text FOR EACH ROW EXECUTE PROCEDURE lastvalue_text_func(); CREATE OR REPLACE FUNCTION lastvalue_text_func_delete() RETURNS TRIGGER AS $BODY$ DECLARE BEGIN IF (TG_OP = 'DELETE') THEN DELETE FROM lastvalue_text WHERE itemid = OLD.itemid; END IF; RETURN OLD; END; $BODY$ LANGUAGE plpgsql; CREATE TRIGGER trigger_delete_lastvalue_text BEFORE DELETE ON items FOR EACH ROW EXECUTE PROCEDURE lastvalue_text_func_delete(); ************************************************************************** history_uint CREATE TABLE lastvalue_uint( itemid bigint primary key, clock integer NOT NULL, value numeric(20,0) NOT NULL); CREATE OR REPLACE FUNCTION lastvalue_uint_func() RETURNS TRIGGER AS $BODY$ DECLARE BEGIN IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE' ) THEN INSERT INTO lastvalue_uint(itemid, clock, value) VALUES(NEW.itemid, NEW.clock, NEW.value) ON CONFLICT (itemid) DO UPDATE SET clock = NEW.clock, value = NEW.value; END IF; RETURN NEW; END; $BODY$ LANGUAGE plpgsql; CREATE TRIGGER trigger_insert_lastvalue_uint BEFORE INSERT OR UPDATE ON history_uint FOR EACH ROW EXECUTE PROCEDURE lastvalue_uint_func(); CREATE OR REPLACE FUNCTION lastvalue_uint_func_delete() RETURNS TRIGGER AS $BODY$ DECLARE BEGIN IF (TG_OP = 'DELETE') THEN DELETE FROM lastvalue_uint WHERE itemid = OLD.itemid; END IF; RETURN OLD; END; $BODY$ LANGUAGE plpgsql; CREATE TRIGGER trigger_delete_lastvalue_uint BEFORE DELETE ON items FOR EACH ROW EXECUTE PROCEDURE lastvalue_uint_func_delete(); ************************************************************************** Update permissions on the DB to zabbix and grafana_user (in case you are using Grafana to query directly the DB): GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO zabbix; GRANT USAGE ON SCHEMA public TO grafana_user; GRANT SELECT ON all tables in schema public TO grafana_user;