pg.ddx.io pgsql-general@postgresql.org mailing list archive
help / color / mirror / Atom feedquestion on trigger
12+ messages / 7 participants
[nested] [flat]
* question on trigger
@ 2001-06-23 23:10 rui zhong <rick_rui@hotmail.com>
2001-06-23 23:21 ` Re: question on trigger Daniel Åkerud <zilch@home.se>
2001-06-24 00:03 ` Re: question on trigger GH <grasshacker@over-yonder.net>
0 siblings, 2 replies; 12+ messages in thread
From: rui zhong @ 2001-06-23 23:10 UTC (permalink / raw)
To: rick_rui@hotmail.com; pgsql-general; pgsql-jdbc@postgresql.org
Hi,all:
This is my first time to use trigger. I try an example from programmer's
guide. Firstly I save the procedure named trigf.c, then i try to comlile it
by using SQL statement " create function trigf() returns opaque as
'...path_to_so' language 'c' ", then I got error message as " Load of file
/home/postgres/trigf.c failed: invalid ELF header ". I don't know how to
fix this, please help me out. Lots of thanks.
The including H file in trigf.c is :
#include "executor/spi.h" /*this is what you need to work with SPI */
#include "commands/trigger.h" /*-"- and triggers */
extern Datum trigf(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(trigf);
Datum
trigf(PG_FUNCTION_ARGS)
{ ... }
Rui
_________________________________________________________________
Get your FREE download of MSN Explorer at http://explorer.msn.com
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: question on trigger
2001-06-23 23:10 question on trigger rui zhong <rick_rui@hotmail.com>
@ 2001-06-23 23:21 ` Daniel Åkerud <zilch@home.se>
1 sibling, 0 replies; 12+ messages in thread
From: Daniel Åkerud @ 2001-06-23 23:21 UTC (permalink / raw)
To: pgsql-general
Judging by the error message, I would say it looks for a compiled version of
your file.
Daniel Åkerud
>
> Hi,all:
>
> This is my first time to use trigger. I try an example from programmer's
> guide. Firstly I save the procedure named trigf.c, then i try to comlile
it
> by using SQL statement " create function trigf() returns opaque as
> '...path_to_so' language 'c' ", then I got error message as " Load of file
> /home/postgres/trigf.c failed: invalid ELF header ". I don't know how to
> fix this, please help me out. Lots of thanks.
>
> The including H file in trigf.c is :
>
>
> #include "executor/spi.h" /*this is what you need to work with SPI */
> #include "commands/trigger.h" /*-"- and triggers */
>
> extern Datum trigf(PG_FUNCTION_ARGS);
>
> PG_FUNCTION_INFO_V1(trigf);
>
> Datum
> trigf(PG_FUNCTION_ARGS)
> { ... }
>
>
>
>
> Rui
>
>
>
>
>
>
> _________________________________________________________________
> Get your FREE download of MSN Explorer at http://explorer.msn.com
>
----------------------------------------------------------------------------
----
>
----------------------------------------------------------------------------
----
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
>
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: question on trigger
2001-06-23 23:10 question on trigger rui zhong <rick_rui@hotmail.com>
@ 2001-06-24 00:03 ` GH <grasshacker@over-yonder.net>
1 sibling, 0 replies; 12+ messages in thread
From: GH @ 2001-06-24 00:03 UTC (permalink / raw)
To: rui zhong <rick_rui@hotmail.com>; +Cc: pgsql-general
And you forwarded this to -jdbc because...?
On Sat, Jun 23, 2001 at 11:10:58PM -0000, some SMTP stream spewed forth:
> Hi,all:
> This is my first time to use trigger. I try an example from programmer's
> guide. Firstly I save the procedure named trigf.c, then i try to comlile it
> by using SQL statement " create function trigf() returns opaque as
> '...path_to_so' language 'c' ", then I got error message as " Load of file
> /home/postgres/trigf.c failed: invalid ELF header ". I don't know how to
> fix this, please help me out. Lots of thanks.
As far as I know, you need to compile the function as a dynamic object:
from:
http://postgresql.crimelabs.net/users-lounge/docs/7.0/user/sql-createfunction.htm
obj_file , link_symbol
This form of the AS clause is used for dynamically-linked, C
language functions when the function name in the C language source code
is not the
same as the name of the SQL function. The string obj_file is the
name of the file containing the dynamically loadable object, and
link_symbol, is
the object's link symbol which is the same as the name of the
function in the C language source code.
Where did you find this example?
gh
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: question on trigger
@ 2001-06-24 01:56 rui zhong <rick_rui@hotmail.com>
0 siblings, 0 replies; 12+ messages in thread
From: rui zhong @ 2001-06-24 01:56 UTC (permalink / raw)
To: grasshacker@over-yonder.net; +Cc: pgsql-general
>Where did you find this example?
>
>gh
Hi, gh:
Thank you.
This example can be found from following link.
http://www.ca.postgresql.org/devel-corner/docs/programmer/trigger-examples.html
_________________________________________________________________
Get your FREE download of MSN Explorer at http://explorer.msn.com
^ permalink raw reply [nested|flat] 12+ messages in thread
* question on trigger
@ 2012-02-11 16:22 mgould@isstrucksoftware.net
2012-02-11 16:53 ` Re: question on trigger Terry Lee Tucker <terry@chosen-ones.org>
0 siblings, 1 reply; 12+ messages in thread
From: mgould@isstrucksoftware.net @ 2012-02-11 16:22 UTC (permalink / raw)
To: pgsql-general
--=_3ba9f5a36ba1bcdad508f2f9054da944
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset="utf-8"
<!-- wmLetter_head_start -->=0A<table align=3D"center" style=3D"empty-cells=
: show;" bgcolor=3D"#ffffff" border=3D"0" cellpadding=3D"0" cellspacing=3D"=
0" width=3D"100%"><tr><td style=3D"text-align: left; background-repeat: no-=
repeat;" align=3D"left"; height=3D"72" colspan=3D"1" background=3D"cid:top@=
a48f3ca396eea5d068ebd27bcb06ebfd"</td></tr><tr><td style=3D"vertical-align:=
top;"><div style=3D"padding: 5px; overflow-x: auto;"><!-- wmLetter_head_en=
d --><html><body><span style=3D"font-family:Verdana; color:#000000; font-si=
ze:10pt;"><div>I will have several triggers which will make sure that the d=
ata in some columns in in uppercase format. For insert it is a no bra=
iner, however for updates, it is better to check and see if the new values =
is the same and only update if different? We are not talking about a huge n=
umber of transactions. In one day we might have at the most 3000 tran=
sactions.<br></div><div><br></div><div>Michael Gould</div><div>Intermodal S=
oftware Solutions, LLC</div><div>904-226-0978</div></span></body></html><!-=
- wmLetter_tail_start --></div></td></tr></table><!-- wmLetter_tail_end -->
--=_3ba9f5a36ba1bcdad508f2f9054da944
Content-Transfer-Encoding: base64
Content-ID: <top@a48f3ca396eea5d068ebd27bcb06ebfd>
Content-Type: image/png;
name="top.letterhead";
Content-Disposition: inline;
filename="top.letterhead";
iVBORw0KGgoAAAANSUhEUgAAAJYAAABICAYAAAFjMjwrAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAK
TWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQ
WaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec
5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28A
AgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0
ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaO
WJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHi
wmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryM
AgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0l
YqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHi
NLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYA
QH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6c
wR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBie
whi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1c
QPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqO
Y4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hM
WEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgoh
JZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSU
Eko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/p
dLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Y
b1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7O
UndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsb
di97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W
7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83
MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxr
PGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW
2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1
U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd
8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H0
8PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+H
vqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsG
Lww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjg
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
AK7NBxpZr8mjAAAAAElFTkSuQmCC
--=_3ba9f5a36ba1bcdad508f2f9054da944--
Attachments:
top.letterhead (image/png, 23.4K) download
view image
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: question on trigger
2012-02-11 16:22 question on trigger mgould@isstrucksoftware.net
@ 2012-02-11 16:53 ` Terry Lee Tucker <terry@chosen-ones.org>
0 siblings, 0 replies; 12+ messages in thread
From: Terry Lee Tucker @ 2012-02-11 16:53 UTC (permalink / raw)
To: pgsql-general
On Saturday, February 11, 2012 09:22:44 AM mgould@isstrucksoftware.net
wrote:
> I will have several triggers which will make sure that the data in some
> columns in in uppercase format. For insert it is a no brainer, however for
> updates, it is better to check and see if the new values is the same and
> only update if different? We are not talking about a huge number of
> transactions. In one day we might have at the most 3000 transactions.
>
> Michael Gould
> Intermodal Software Solutions, LLC
> 904-226-0978
--
Michael:
I am by no means an expert on database performance; however, it seems to me
that you would waste more cycles checking if things changed than simply
forcing upper case for all to which this criteria applies. The whole record is
going to be written to the database anyway.
Terry Lee Tucker
Office: 336-372-6812
^ permalink raw reply [nested|flat] 12+ messages in thread
* Question on trigger
@ 2024-04-11 14:31 veem v <veema0000@gmail.com>
2024-04-11 16:30 ` Re: Question on trigger Adrian Klaver <adrian.klaver@aklaver.com>
0 siblings, 1 reply; 12+ messages in thread
From: veem v @ 2024-04-11 14:31 UTC (permalink / raw)
To: pgsql-general <pgsql-general@lists.postgresql.org>
Hi, We used to use Oracle database in which we had audit triggers(something
as below) mandated for all tables by the control team. Now we are going to
use the postgresql 15.4 database for one of our applications. So,wanted to
understand if there exists any downside of such audit trigger setup for all
the tables? Will it impact the bulk data insert/update/delete OR slowdown
of any of the DML operations significantly (and thus will not be advisable
to use for all tables but selected ones)?
CREATE OR REPLACE TRIGGER TAB_AUD_TRG
BEFORE DELETE OR INSERT OR UPDATE
ON tab
FOR EACH ROW
BEGIN
IF inserting THEN
:NEW.create_timestamp := systimestamp;
:NEW.create_userid := sys_context('USERENV','SESSION_USER');
:NEW.update_timestamp := systimestamp;
:NEW.update_userid := sys_context('USERENV','SESSION_USER');
ELSIF updating THEN
IF updating('create_userid') OR updating('create_timestamp') THEN
:new.create_userid := :old.create_userid;
:new.create_timestamp := :old.create_timestamp;
END IF;
:NEW.update_timestamp := systimestamp;
:NEW.update_userid := sys_context('USERENV','SESSION_USER');
END IF;
END;
/
Regards
Veem
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Question on trigger
2024-04-11 14:31 Question on trigger veem v <veema0000@gmail.com>
@ 2024-04-11 16:30 ` Adrian Klaver <adrian.klaver@aklaver.com>
2024-04-13 07:03 ` Re: Question on trigger veem v <veema0000@gmail.com>
0 siblings, 1 reply; 12+ messages in thread
From: Adrian Klaver @ 2024-04-11 16:30 UTC (permalink / raw)
To: veem v <veema0000@gmail.com>; pgsql-general <pgsql-general@lists.postgresql.org>
On 4/11/24 07:31, veem v wrote:
> Hi, We used to use Oracle database in which we had audit
> triggers(something as below) mandated for all tables by the control
> team. Now we are going to use the postgresql 15.4 database for one of
> our applications. So,wanted to understand if there exists any downside
> of such audit trigger setup for all the tables? Will it impact the bulk
> data insert/update/delete OR slowdown of any of the DML operations
> significantly (and thus will not be advisable to use for all tables but
> selected ones)?
Triggers are overhead in Postgres as they where in Oracle. If they
didn't cause an issue in Oracle I would suspect that would also be the
case in Postgres. To confirm you would need to create a test setup and
run some common operations and see what the overhead is.
Some potential performance improvements:
https://www.postgresql.org/docs/current/sql-createtrigger.html
"...a trigger that is marked FOR EACH STATEMENT only executes once for
any given operation, regardless of how many rows it modifies (in
particular, an operation that modifies zero rows will still result in
the execution of any applicable FOR EACH STATEMENT triggers)."
<...>
"The REFERENCING option enables collection of transition relations,
which are row sets that include all of the rows inserted, deleted, or
modified by the current SQL statement. This feature lets the trigger see
a global view of what the statement did, not just one row at a time.
This option is only allowed for an AFTER trigger that is not a
constraint trigger; also, if the trigger is an UPDATE trigger, it must
not specify a column_name list. OLD TABLE may only be specified once,
and only for a trigger that can fire on UPDATE or DELETE; it creates a
transition relation containing the before-images of all rows updated or
deleted by the statement. Similarly, NEW TABLE may only be specified
once, and only for a trigger that can fire on UPDATE or INSERT; it
creates a transition relation containing the after-images of all rows
updated or inserted by the statement."
As example:
https://www.postgresql.org/docs/current/plpgsql-trigger.html
Example 43.7. Auditing with Transition Tables
>
> CREATE OR REPLACE TRIGGER TAB_AUD_TRG
> BEFORE DELETE OR INSERT OR UPDATE
> ON tab
> FOR EACH ROW
> BEGIN
> IF inserting THEN
> :NEW.create_timestamp := systimestamp;
> :NEW.create_userid := sys_context('USERENV','SESSION_USER');
> :NEW.update_timestamp := systimestamp;
> :NEW.update_userid := sys_context('USERENV','SESSION_USER');
> ELSIF updating THEN
> IF updating('create_userid') OR updating('create_timestamp') THEN
> :new.create_userid := :old.create_userid;
> :new.create_timestamp := :old.create_timestamp;
> END IF;
> :NEW.update_timestamp := systimestamp;
> :NEW.update_userid := sys_context('USERENV','SESSION_USER');
> END IF;
> END;
> /
>
> Regards
> Veem
--
Adrian Klaver
adrian.klaver@aklaver.com
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Question on trigger
2024-04-11 14:31 Question on trigger veem v <veema0000@gmail.com>
2024-04-11 16:30 ` Re: Question on trigger Adrian Klaver <adrian.klaver@aklaver.com>
@ 2024-04-13 07:03 ` veem v <veema0000@gmail.com>
2024-04-13 16:14 ` Re: Question on trigger Adrian Klaver <adrian.klaver@aklaver.com>
0 siblings, 1 reply; 12+ messages in thread
From: veem v @ 2024-04-13 07:03 UTC (permalink / raw)
To: Adrian Klaver <adrian.klaver@aklaver.com>; +Cc: pgsql-general <pgsql-general@lists.postgresql.org>
Thank you Adrian.
So it seems the heavy DML tables will see an impact if having triggers
(mainly for each row trigger) created on them.
And also the bulk DML/array based insert (which inserts multiple rows in
one short or one batch) , in those cases it seems the trigger will not make
that happen as it will force it to make it happen row by row, as the
trigger is row based. Will test anyway though.
On Thu, 11 Apr 2024 at 22:00, Adrian Klaver <adrian.klaver@aklaver.com>
wrote:
> On 4/11/24 07:31, veem v wrote:
> > Hi, We used to use Oracle database in which we had audit
> > triggers(something as below) mandated for all tables by the control
> > team. Now we are going to use the postgresql 15.4 database for one of
> > our applications. So,wanted to understand if there exists any downside
> > of such audit trigger setup for all the tables? Will it impact the bulk
> > data insert/update/delete OR slowdown of any of the DML operations
> > significantly (and thus will not be advisable to use for all tables but
> > selected ones)?
>
> Triggers are overhead in Postgres as they where in Oracle. If they
> didn't cause an issue in Oracle I would suspect that would also be the
> case in Postgres. To confirm you would need to create a test setup and
> run some common operations and see what the overhead is.
>
> Some potential performance improvements:
>
> https://www.postgresql.org/docs/current/sql-createtrigger.html
>
> "...a trigger that is marked FOR EACH STATEMENT only executes once for
> any given operation, regardless of how many rows it modifies (in
> particular, an operation that modifies zero rows will still result in
> the execution of any applicable FOR EACH STATEMENT triggers)."
>
> <...>
>
> "The REFERENCING option enables collection of transition relations,
> which are row sets that include all of the rows inserted, deleted, or
> modified by the current SQL statement. This feature lets the trigger see
> a global view of what the statement did, not just one row at a time.
> This option is only allowed for an AFTER trigger that is not a
> constraint trigger; also, if the trigger is an UPDATE trigger, it must
> not specify a column_name list. OLD TABLE may only be specified once,
> and only for a trigger that can fire on UPDATE or DELETE; it creates a
> transition relation containing the before-images of all rows updated or
> deleted by the statement. Similarly, NEW TABLE may only be specified
> once, and only for a trigger that can fire on UPDATE or INSERT; it
> creates a transition relation containing the after-images of all rows
> updated or inserted by the statement."
>
>
> As example:
>
> https://www.postgresql.org/docs/current/plpgsql-trigger.html
>
> Example 43.7. Auditing with Transition Tables
>
> >
> > CREATE OR REPLACE TRIGGER TAB_AUD_TRG
> > BEFORE DELETE OR INSERT OR UPDATE
> > ON tab
> > FOR EACH ROW
> > BEGIN
> > IF inserting THEN
> > :NEW.create_timestamp := systimestamp;
> > :NEW.create_userid := sys_context('USERENV','SESSION_USER');
> > :NEW.update_timestamp := systimestamp;
> > :NEW.update_userid := sys_context('USERENV','SESSION_USER');
> > ELSIF updating THEN
> > IF updating('create_userid') OR updating('create_timestamp')
> THEN
> > :new.create_userid := :old.create_userid;
> > :new.create_timestamp := :old.create_timestamp;
> > END IF;
> > :NEW.update_timestamp := systimestamp;
> > :NEW.update_userid := sys_context('USERENV','SESSION_USER');
> > END IF;
> > END;
> > /
> >
> > Regards
> > Veem
>
> --
> Adrian Klaver
> adrian.klaver@aklaver.com
>
>
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Question on trigger
2024-04-11 14:31 Question on trigger veem v <veema0000@gmail.com>
2024-04-11 16:30 ` Re: Question on trigger Adrian Klaver <adrian.klaver@aklaver.com>
2024-04-13 07:03 ` Re: Question on trigger veem v <veema0000@gmail.com>
@ 2024-04-13 16:14 ` Adrian Klaver <adrian.klaver@aklaver.com>
2024-04-16 19:39 ` Re: Question on trigger veem v <veema0000@gmail.com>
0 siblings, 1 reply; 12+ messages in thread
From: Adrian Klaver @ 2024-04-13 16:14 UTC (permalink / raw)
To: veem v <veema0000@gmail.com>; +Cc: pgsql-general <pgsql-general@lists.postgresql.org>
On 4/13/24 00:03, veem v wrote:
> Thank you Adrian.
>
> So it seems the heavy DML tables will see an impact if having triggers
> (mainly for each row trigger) created on them.
>
> And also the bulk DML/array based insert (which inserts multiple rows in
> one short or one batch) , in those cases it seems the trigger will not
> make that happen as it will force it to make it happen row by row, as
> the trigger is row based. Will test anyway though.
You said you have triggers in the Oracle database and I assumed they
worked and where not a show stopping issue there. What makes you think
that would be different in Postgres?
What type of triggers where there in Oracle, per row, per statement or a
mix?
>
> On Thu, 11 Apr 2024 at 22:00, Adrian Klaver <adrian.klaver@aklaver.com
> <mailto:adrian.klaver@aklaver.com>> wrote:
>
> On 4/11/24 07:31, veem v wrote:
> > Hi, We used to use Oracle database in which we had audit
> > triggers(something as below) mandated for all tables by the control
> > team. Now we are going to use the postgresql 15.4 database for
> one of
> > our applications. So,wanted to understand if there exists any
> downside
> > of such audit trigger setup for all the tables? Will it impact
> the bulk
> > data insert/update/delete OR slowdown of any of the DML operations
> > significantly (and thus will not be advisable to use for all
> tables but
> > selected ones)?
>
> Triggers are overhead in Postgres as they where in Oracle. If they
> didn't cause an issue in Oracle I would suspect that would also be the
> case in Postgres. To confirm you would need to create a test setup and
> run some common operations and see what the overhead is.
>
> Some potential performance improvements:
>
> https://www.postgresql.org/docs/current/sql-createtrigger.html
> <https://www.postgresql.org/docs/current/sql-createtrigger.html;
>
> "...a trigger that is marked FOR EACH STATEMENT only executes once for
> any given operation, regardless of how many rows it modifies (in
> particular, an operation that modifies zero rows will still result in
> the execution of any applicable FOR EACH STATEMENT triggers)."
>
> <...>
>
> "The REFERENCING option enables collection of transition relations,
> which are row sets that include all of the rows inserted, deleted, or
> modified by the current SQL statement. This feature lets the trigger
> see
> a global view of what the statement did, not just one row at a time.
> This option is only allowed for an AFTER trigger that is not a
> constraint trigger; also, if the trigger is an UPDATE trigger, it must
> not specify a column_name list. OLD TABLE may only be specified once,
> and only for a trigger that can fire on UPDATE or DELETE; it creates a
> transition relation containing the before-images of all rows updated or
> deleted by the statement. Similarly, NEW TABLE may only be specified
> once, and only for a trigger that can fire on UPDATE or INSERT; it
> creates a transition relation containing the after-images of all rows
> updated or inserted by the statement."
>
>
> As example:
>
> https://www.postgresql.org/docs/current/plpgsql-trigger.html
> <https://www.postgresql.org/docs/current/plpgsql-trigger.html;
>
> Example 43.7. Auditing with Transition Tables
>
> >
> > CREATE OR REPLACE TRIGGER TAB_AUD_TRG
> > BEFORE DELETE OR INSERT OR UPDATE
> > ON tab
> > FOR EACH ROW
> > BEGIN
> > IF inserting THEN
> > :NEW.create_timestamp := systimestamp;
> > :NEW.create_userid :=
> sys_context('USERENV','SESSION_USER');
> > :NEW.update_timestamp := systimestamp;
> > :NEW.update_userid := sys_context('USERENV','SESSION_USER');
> > ELSIF updating THEN
> > IF updating('create_userid') OR
> updating('create_timestamp') THEN
> > :new.create_userid := :old.create_userid;
> > :new.create_timestamp := :old.create_timestamp;
> > END IF;
> > :NEW.update_timestamp := systimestamp;
> > :NEW.update_userid := sys_context('USERENV','SESSION_USER');
> > END IF;
> > END;
> > /
> >
> > Regards
> > Veem
>
> --
> Adrian Klaver
> adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.com>
>
--
Adrian Klaver
adrian.klaver@aklaver.com
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Question on trigger
2024-04-11 14:31 Question on trigger veem v <veema0000@gmail.com>
2024-04-11 16:30 ` Re: Question on trigger Adrian Klaver <adrian.klaver@aklaver.com>
2024-04-13 07:03 ` Re: Question on trigger veem v <veema0000@gmail.com>
2024-04-13 16:14 ` Re: Question on trigger Adrian Klaver <adrian.klaver@aklaver.com>
@ 2024-04-16 19:39 ` veem v <veema0000@gmail.com>
2024-04-16 20:23 ` Re: Question on trigger Adrian Klaver <adrian.klaver@aklaver.com>
0 siblings, 1 reply; 12+ messages in thread
From: veem v @ 2024-04-16 19:39 UTC (permalink / raw)
To: Adrian Klaver <adrian.klaver@aklaver.com>; +Cc: pgsql-general <pgsql-general@lists.postgresql.org>
On Sat, 13 Apr 2024 at 21:44, Adrian Klaver <adrian.klaver@aklaver.com>
wrote:
> On 4/13/24 00:03, veem v wrote:
> > Thank you Adrian.
> >
> > So it seems the heavy DML tables will see an impact if having triggers
> > (mainly for each row trigger) created on them.
> >
> > And also the bulk DML/array based insert (which inserts multiple rows in
> > one short or one batch) , in those cases it seems the trigger will not
> > make that happen as it will force it to make it happen row by row, as
> > the trigger is row based. Will test anyway though.
>
> You said you have triggers in the Oracle database and I assumed they
> worked and where not a show stopping issue there. What makes you think
> that would be different in Postgres?
>
> What type of triggers where there in Oracle, per row, per statement or a
> mix?
>
>
Actually we have row level triggers in oracle which are running for
smaller volume DML and are making the direct path inserts to happen in
conventional row by row insert, in presence of trigger. So was wondering if
it postgres we will be encountering a similar issue and batch inserts may
be converted back to row by row automatically. And here we are going to
process higher volume DMLS in postgresql database.
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Question on trigger
2024-04-11 14:31 Question on trigger veem v <veema0000@gmail.com>
2024-04-11 16:30 ` Re: Question on trigger Adrian Klaver <adrian.klaver@aklaver.com>
2024-04-13 07:03 ` Re: Question on trigger veem v <veema0000@gmail.com>
2024-04-13 16:14 ` Re: Question on trigger Adrian Klaver <adrian.klaver@aklaver.com>
2024-04-16 19:39 ` Re: Question on trigger veem v <veema0000@gmail.com>
@ 2024-04-16 20:23 ` Adrian Klaver <adrian.klaver@aklaver.com>
0 siblings, 0 replies; 12+ messages in thread
From: Adrian Klaver @ 2024-04-16 20:23 UTC (permalink / raw)
To: veem v <veema0000@gmail.com>; +Cc: pgsql-general <pgsql-general@lists.postgresql.org>
On 4/16/24 12:39, veem v wrote:
>
>
> On Sat, 13 Apr 2024 at 21:44, Adrian Klaver <adrian.klaver@aklaver.com
> <mailto:adrian.klaver@aklaver.com>> wrote:
>
> On 4/13/24 00:03, veem v wrote:
> > Thank you Adrian.
> >
> > So it seems the heavy DML tables will see an impact if having
> triggers
> > (mainly for each row trigger) created on them.
> >
> > And also the bulk DML/array based insert (which inserts multiple
> rows in
> > one short or one batch) , in those cases it seems the trigger
> will not
> > make that happen as it will force it to make it happen row by
> row, as
> > the trigger is row based. Will test anyway though.
>
> You said you have triggers in the Oracle database and I assumed they
> worked and where not a show stopping issue there. What makes you think
> that would be different in Postgres?
>
> What type of triggers where there in Oracle, per row, per statement
> or a
> mix?
>
>
> Actually we have row level triggers in oracle which are running for
> smaller volume DML and are making the direct path inserts to happen in
> conventional row by row insert, in presence of trigger. So was wondering
Not sure what the above means, you will need to provide a more detailed
description. Though any DML you are doing on table that has any sort of
constraint, index, trigger, foreign key, default values, etc is going to
have more overhead then into an unencumbered table. FYI, some of the
preceding are system triggers, for example foreign keys.
> if it postgres we will be encountering a similar issue and batch inserts
> may be converted back to row by row automatically. And here we are going
> to process higher volume DMLS in postgresql database.
>
Hard to say with the information provided. Easiest way to find out is
create a test setup and run the code. Though I guess, as I have not
actually tried this, you could have a per row trigger and per statement
trigger for the same action and disable the per row and enable the per
statement trigger for batch operations. Then once the batch operation is
done reverse the process. Again something to test to verify.
--
Adrian Klaver
adrian.klaver@aklaver.com
^ permalink raw reply [nested|flat] 12+ messages in thread
end of thread, other threads:[~2024-04-16 20:23 UTC | newest]
Thread overview: 12+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2001-06-23 23:10 question on trigger rui zhong <rick_rui@hotmail.com>
2001-06-23 23:21 ` Daniel Åkerud <zilch@home.se>
2001-06-24 00:03 ` GH <grasshacker@over-yonder.net>
2001-06-24 01:56 Re: question on trigger rui zhong <rick_rui@hotmail.com>
2012-02-11 16:22 question on trigger mgould@isstrucksoftware.net
2012-02-11 16:53 ` Terry Lee Tucker <terry@chosen-ones.org>
2024-04-11 14:31 Question on trigger veem v <veema0000@gmail.com>
2024-04-11 16:30 ` Re: Question on trigger Adrian Klaver <adrian.klaver@aklaver.com>
2024-04-13 07:03 ` Re: Question on trigger veem v <veema0000@gmail.com>
2024-04-13 16:14 ` Re: Question on trigger Adrian Klaver <adrian.klaver@aklaver.com>
2024-04-16 19:39 ` Re: Question on trigger veem v <veema0000@gmail.com>
2024-04-16 20:23 ` Re: Question on trigger Adrian Klaver <adrian.klaver@aklaver.com>
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox