NOTE: wal_level = logical Publication Session: CREATE TABLE t1 (a INT); CREATE PUBLICATION my_publication FOR TABLE t1; Subscription Session: CREATE TABLE t1 (a INT); CREATE SUBSCRIPTION my_subscription CONNECTION '' PUBLICATION my_publication; CREATE OR REPLACE FUNCTION handle_exception_trigger() RETURNS TRIGGER AS $$ BEGIN BEGIN -- Raise an exception RAISE EXCEPTION 'This is a test exception'; EXCEPTION WHEN OTHERS THEN -- Silently handle the exception -- You can optionally log it if needed -- RAISE NOTICE 'Caught exception: %', SQLERRM; RETURN NEW; END; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER silent_exception_trigger AFTER INSERT OR UPDATE ON t1 FOR EACH ROW EXECUTE FUNCTION handle_exception_trigger(); -- Just force it to always trigger for simplicity ALTER TABLE t1 ENABLE ALWAYS TRIGGER silent_exception_trigger; -- Mark down the current value SELECT * from pg_replication_origin_status; Publication Session: INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (2); INSERT INTO t1 VALUES (3); Subscription Session: -- All 3 changes should be present SELECT * FROM t1; -- The new value will be equivalent to the original value -- even though three new changes have been applied from the remote SELECT * from pg_replication_origin_status;