Re: For each statement trigger and update table
Rene Romero Benavides <rene.romero.b@gmail.com>
From: Rene Romero Benavides <rene.romero.b@gmail.com>
To: Mike Martin <mike@redtux.plus.com>
Cc: pgsql-sql@lists.postgresql.org
Date: 2020-01-05T19:42:30Z
Lists: pgsql-sql
Ok, great you figured it out. On Sun, Jan 5, 2020 at 10:11 AM Mike Martin <mike@redtux.plus.com> wrote: > > Thanks I had looked at that before, but it turns out I had a small error > in my criteria. altered to > IF pg_trigger_depth() = 1 THEN > > WITH arrfile AS(SELECT a.fileid,a.tagfile > tagfilenew,(regexp_split_to_array(a.tagfile,'/'))[2:] filearr1 > FROM > tagfile_new a), > > arrfile2 AS(SELECT fileid,o.tagfile > tagfileold,tagfilenew,filearr1[1:cardinality(filearr1)-1]||regexp_matches(filearr1[cardinality(filearr1)],'(.*)\.(.*)') > filearr > FROM arrfile a > JOIN > tagfile_old o using(fileid) > ) > > UPDATE tagfile tf SET filearr=a2.filearr > FROM arrfile2 a2 > WHERE tf.fileid=a2.fileid AND a2.tagfilenew != a2.tagfileold; > END IF; > > I misunderstood the docs and realised I needed to compare old table and > new table rather than tagfile and new table > > On Sun, 5 Jan 2020 at 01:49, Rene Romero Benavides < > rene.romero.b@gmail.com> wrote: > >> Try with pg_trigger_depth() = 1 >> pg_trigger_depth() int current nesting level of PostgreSQL triggers (0 >> if not called, directly or indirectly, from inside a trigger)because >> you're calling your procedure by means of a trigger >> https://www.postgresql.org/docs/12/functions-info.html >> >> On Fri, Jan 3, 2020 at 9:46 PM Mike Martin <mike@redtux.plus.com> wrote: >> >>> This is the function >>> >>> CREATE OR REPLACE FUNCTION public.tagfile_upd_su() >>> RETURNS trigger >>> LANGUAGE 'plpgsql' >>> COST 100 >>> VOLATILE NOT LEAKPROOF >>> AS $BODY$ >>> BEGIN >>> >>> WITH arrfile AS(SELECT >>> fileid,tagfile,(regexp_split_to_array(tagfile,'/'))[2:] filearr1 FROM >>> tagfile_new), >>> arrfile2 AS(SELECT >>> fileid,tagfile,filearr1[1:cardinality(filearr1)-1]||regexp_matches(filearr1[cardinality(filearr1)],'(.*)\.(.*)') >>> filearr >>> FROM arrfile) >>> >>> UPDATE tagfile tf SET filearr=a2.filearr >>> FROM arrfile2 a2 >>> WHERE EXISTS (SELECT 1 FROM arrfile2 af WHERE tf.fileid=af.fileid AND >>> af.tagfile != tf.tagfile); >>> END >>> >>> Would really prefer not to have a row level function. The Insert version >>> works perfefectly. >>> I have tried using pg_trigger_depth, but that stops the trigger running >>> at all >>> >>> Trigger definition is >>> >>> CREATE TRIGGER tagfile_uas >>> AFTER UPDATE >>> ON public.tagfile >>> REFERENCING OLD TABLE tagfile_old NEW TABLE AS tagfile_new >>> FOR EACH STATEMENT >>> --WHEN (pg_trigger_depth() < 1) >>> EXECUTE PROCEDURE public.tagfile_upd_su() >>> ; >>> (please note commented out pg_trigger_depth which stopped trigger firing >>> at all >>> >>> On Sat, 4 Jan 2020 at 00:26, Rene Romero Benavides < >>> rene.romero.b@gmail.com> wrote: >>> >>>> Mike, please include to the mailing list as well, so others can help >>>> you out too. Why do you need the trigger to be FOR EACH STATEMENT? so I can >>>> understand your use case, even if it's simple stuff, please share with us >>>> your code. >>>> >>>> On Fri, Jan 3, 2020 at 6:06 PM Rene Romero Benavides < >>>> rene.romero.b@gmail.com> wrote: >>>> >>>>> Oh, so you're defining transition relations (REFERENCING NEW TABLE, >>>>> OLD TABLE ) as in here? >>>>> >>>>> CREATE TRIGGER paired_items_update >>>>> AFTER UPDATE ON paired_items >>>>> REFERENCING NEW TABLE AS newtab OLD TABLE AS oldtab >>>>> FOR EACH ROW >>>>> EXECUTE FUNCTION check_matching_pairs(); >>>>> >>>>> >>>>> On Fri, Jan 3, 2020 at 5:55 PM Mike Martin <mike@redtux.plus.com> >>>>> wrote: >>>>> >>>>>> According to the docs, not possible to use a transition table and >>>>>> column list together >>>>>> >>>>>> On Fri, 3 Jan 2020, 23:39 Rene Romero Benavides, < >>>>>> rene.romero.b@gmail.com> wrote: >>>>>> >>>>>>> > I can give code when I get home, but it's pretty simple stuff >>>>>>> please do so, along with your trigger definition. Are you aware that >>>>>>> you can define your update trigger to fire on a specific column? >>>>>>> >>>>>>> https://www.postgresql.org/docs/current/sql-createtrigger.html >>>>>>> >>>>>>> For UPDATE events, it is possible to specify a list of columns >>>>>>> using this syntax: >>>>>>> >>>>>>> UPDATE OF column_name1 [, column_name2 ... ] >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Fri, Jan 3, 2020 at 5:21 PM Mike Martin <mike@redtux.plus.com> >>>>>>> wrote: >>>>>>> >>>>>>>> Not sure if this is possible >>>>>>>> Basically I want to have a trigger which updates an array column in >>>>>>>> the same table when a column is updated >>>>>>>> This works as a row level trigger, but not as per statement >>>>>>>> I have hit the recursive issue (where update fires update trigger >>>>>>>> which fires etc) >>>>>>>> According to the docs I cannot use columns and relative tables >>>>>>>> together >>>>>>>> >>>>>>>> So any suggestions? I can give code when I get home, but it's >>>>>>>> pretty simple stuff >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> El genio es 1% inspiración y 99% transpiración. >>>>>>> Thomas Alva Edison >>>>>>> http://pglearn.blogspot.mx/ >>>>>>> >>>>>>> >>>>> >>>>> -- >>>>> El genio es 1% inspiración y 99% transpiración. >>>>> Thomas Alva Edison >>>>> http://pglearn.blogspot.mx/ >>>>> >>>>> >>>> >>>> -- >>>> El genio es 1% inspiración y 99% transpiración. >>>> Thomas Alva Edison >>>> http://pglearn.blogspot.mx/ >>>> >>>> >> >> -- >> El genio es 1% inspiración y 99% transpiración. >> Thomas Alva Edison >> http://pglearn.blogspot.mx/ >> >> -- El genio es 1% inspiración y 99% transpiración. Thomas Alva Edison http://pglearn.blogspot.mx/