Thread
-
For each statement trigger and update table
Mike Martin <mike@redtux.plus.com> — 2020-01-03T23:09:23Z
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
-
Re: For each statement trigger and update table
Rene Romero Benavides <rene.romero.b@gmail.com> — 2020-01-03T23:39:18Z
> 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/
-
Re: For each statement trigger and update table
Mike Martin <mike@redtux.plus.com> — 2020-01-03T23:55:18Z
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/ > >
-
Re: For each statement trigger and update table
Rene Romero Benavides <rene.romero.b@gmail.com> — 2020-01-04T00:06:48Z
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/ -
Re: For each statement trigger and update table
Rene Romero Benavides <rene.romero.b@gmail.com> — 2020-01-04T00:26:34Z
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/
-
Re: For each statement trigger and update table
Mike Martin <mike@redtux.plus.com> — 2020-01-04T00:32:32Z
Will do tomorrow On Sat, 4 Jan 2020, 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/ > >
-
Re: For each statement trigger and update table
Mike Martin <mike@redtux.plus.com> — 2020-01-04T03:45:49Z
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/ > > -
Re: For each statement trigger and update table
Rene Romero Benavides <rene.romero.b@gmail.com> — 2020-01-05T01:49:28Z
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/
-
Re: For each statement trigger and update table
Mike Martin <mike@redtux.plus.com> — 2020-01-05T16:10:47Z
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/ > >
-
Re: For each statement trigger and update table
Rene Romero Benavides <rene.romero.b@gmail.com> — 2020-01-05T19:42:30Z
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/
-
Re: For each statement trigger and update table
Erik Brandsberg <erik@heimdalldata.com> — 2020-01-06T13:53:26Z
Have you printed out what the value of pg_trigger_depth() is? Without testing, my guess is that it is starting with a value of 1, not 0, and as such prevents execution from the start. On Fri, Jan 3, 2020 at 10: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/ >> >> -- *Erik Brandsberg* erik@heimdalldata.com www.heimdalldata.com +1 (866) 433-2824 x 700 [image: AWS Competency Program] <https://aws.amazon.com/partners/find/partnerdetails/?n=Heimdall%20Data&id=001E000001d9pndIAA>