Hi All,
 I was pleasantly surprised to see that triggers can be created on FDW tables. 
I'm running into a problem.

I create a trigger on an imported foreign table. In the procedure, I change the 
value of a column that is not in the triggering update statement. This change 
does not make it to the mysql side.

CREATE OR REPLACE FUNCTION aatrigger_up() returns trigger
AS $$
DECLARE
BEGIN
        
        IF NOT(row_to_json(NEW)->'pgrti' is NULL) THEN
                NEW.pgrti = 2000000000*random();
        END IF;
        RAISE NOTICE 'aarigger_up %', row_to_json(NEW)::text;
  return NEW;

END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER aarigger_up BEFORE UPDATE ON mysql.users FOR EACH ROW EXECUTE 
PROCEDURE aarigger_up();
update mysql.users set email = 'ad...@example.com' where id = 1;        
I can see that the value for pgrti is updated in the NOTICE in postgres. In 
mysql the value is not updated. If I add the target col to the statement it 
does go through

update mysql.users set email = 'ad...@example.com', pgrti=0 where id = 1;       
 I need this to work to be able to detect CRUD coming from PG in a little 
deamon that calls pg_triggers for updates coming from mysqld; without a means 
to detect changes originating from pg the triggers would fire twice. Any idea 
where I'd change MYSQL_FDW to do this (also add fields that are updated in the 
trigger before firing off to mysql)?

I’m seeing in https://github.com/EnterpriseDB/mysql_fdw/blob/master/deparse.c 
<https://github.com/EnterpriseDB/mysql_fdw/blob/master/deparse.c> in 
mysql_deparse_update

That the actual update statement is used to generate the mapping, so any col 
referred to in triggers would be ignored…


TIA, stay safe!
Francois Payette

Reply via email to