Hi
The only thing that can be established is that if the record does not
exist, the trigger will not be updating anything in the table
"tst.time_audit_tbl" for the condition "table_name =
CONCAT(TG_TABLE_SCHEMA, '.', TG_TABLE_NAME)"

Maybe, checking before the UPDATE, if the record does not exist, add it.

IF NOT EXISTS (SELECT 1 FROM tst.time_audit_tbl WHERE table_name =
CONCAT(TG_TABLE_SCHEMA, '.', TG_TABLE_NAME))
THEN
INSERT INTO FROM tst.time_audit_tbl (table_name) VALUES
(CONCAT(TG_TABLE_SCHEMA, '.', TG_TABLE_NAME));
END IF

Atte.
JRBM



El jue, 16 nov 2023 a las 14:19, Avi Weinberg (<a...@gilat.com>) escribió:

> I'm using Postgres (13 and 15) logical replication to sync data from two
> servers. I would like to have an update counter whenever data is changed.
> The counter can be incremented by 1 even if multiple rows are updated, but
> it is also ok to be incremented the counter by the number of rows updated
> (but it seems less efficient to me).
> I need the counter to increase after initial sync as well as after regular
> logical replication sync.
>
> Triggers not to work without ENABLE ALWAYS.
>
> In addition, If I try trigger that is "FOR EACH STATEMENT" it works only
> for initial sync and not for regular logical replication sync.
>
> Having per row set_time_trig  trigger takes about 1 minute when updating
> 50k rows in one transaction (all I need is to increase update_count by 1,
> why spend 1 minute for it) . How can I improve this?
>
> CREATE TABLE IF NOT EXISTS tst.t2
>
> (
>
>     id bigint NOT NULL,
>
>     c1 int,
>
>     CONSTRAINT pk_t2 PRIMARY KEY (id)
>
> );
>
>
>
> CREATE TABLE IF NOT EXISTS tst.time_audit_tbl
>
> (
>
>     table_name character varying(63) COLLATE pg_catalog."default" NOT NULL,
>
>     update_count integer DEFAULT 0,
>
>     CONSTRAINT updated_time_audit_unique UNIQUE (table_name)
>
> );
>
>
>
>
>
> CREATE FUNCTION tst.set_time() RETURNS trigger
>
>     LANGUAGE plpgsql SECURITY DEFINER
>
>     AS $$
>
>     DECLARE
>
>       updated_count int;
>
>     BEGIN
>
>         UPDATE tst.time_audit_tbl SET update_count = update_count + 1
> WHERE table_name = CONCAT(TG_TABLE_SCHEMA, '.', TG_TABLE_NAME);
>
>         GET DIAGNOSTICS updated_count = ROW_COUNT;
>
>         IF updated_count = 0 THEN
>
>               RAISE EXCEPTION 'set_updated_time().  Table not found %.%',
> TG_TABLE_SCHEMA, TG_TABLE_NAME;
>
>         END IF;
>
>
>
>         RETURN coalesce(NEW, OLD);
>
>     END;
>
>     $$;
>
>
>
>
>
> CREATE  TRIGGER set_time_trig
>
>     AFTER INSERT OR DELETE OR UPDATE
>
>     ON tst.t2
>
>     FOR EACH ROW
>
>     EXECUTE FUNCTION tst.set_time();
>
>
>
> ALTER TABLE tst.t2 ENABLE ALWAYS TRIGGER set_time_trig;
>
>
> IMPORTANT - This email and any attachments is intended for the above named
> addressee(s), and may contain information which is confidential or
> privileged. If you are not the intended recipient, please inform the sender
> immediately and delete this email: you should not copy or use this e-mail
> for any purpose nor disclose its contents to any person.
>

Reply via email to