Re: [GENERAL] Trigger to run @ connection time?

2008-03-16 Thread Robert Treat
On Friday 14 March 2008 11:36, Marko Kreen wrote:
> On 3/14/08, Erik Jones <[EMAIL PROTECTED]> wrote:
> >  On Mar 14, 2008, at 7:17 AM, Marko Kreen wrote:
> >  > To put it to core Postgres, it needs to be conceptually sane
> >  > first, without needing ugly workarounds to avoid it bringing
> >  > whole db down.
> >  >
> >  > I can see ATM only few ways:
> >  >
> >  > - Applies only to non-superusers.
> >  >
> >  > - Error from CONNECT trigger does not affect superuser.
> >  >
> >  > - Applies to database + role.  Role could be also group of users.
> >  >
> >  > So you always have way do fix things, without hexediting in data
> >  > dir...
> >
> > Another option:
> >
> >  Does not fire at all in single-user mode.  This would be covered by
> >  "Applies to non-superusers" if that were there but, by itself, the
> >  triggers would still fire for normal superuser connections.
>
> Seems bit too hard - you may other db-s that work fine,
> why should those suffer?
>

there are other failure scenario's for a single db that require single user 
mode (think corrupted indexes), so I'm not sure that is too high a price to 
be paid, though a less barriar would be better.

If we decide that an on connect trigger involves the combination of a database 
and a role, you generally can escape from the failure scenario by having 
either a different role, or a different database with the ability to 
do "alter database disable on connect triggers". whether this is a direct 
alter database, or set at the GUC level, either makes it pretty hard to lock 
yourself out completly, and single user mode can be the fall back for that if 
needed. 

-- 
Robert Treat
Build A Brighter LAMP :: Linux Apache {middleware} PostgreSQL

-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] Trigger to run @ connection time?

2008-03-14 Thread Erik Jones


On Mar 14, 2008, at 10:36 AM, Marko Kreen wrote:


Another option:

Does not fire at all in single-user mode.  This would be covered by
"Applies to non-superusers" if that were there but, by itself, the
triggers would still fire for normal superuser connections.


Seems bit too hard - you may other db-s that work fine,
why should those suffer?


Excellent point.

Erik Jones

DBA | Emma®
[EMAIL PROTECTED]
800.595.4401 or 615.292.5888
615.292.0777 (fax)

Emma helps organizations everywhere communicate & market in style.
Visit us online at http://www.myemma.com




--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] Trigger to run @ connection time?

2008-03-14 Thread Marko Kreen
On 3/14/08, Erik Jones <[EMAIL PROTECTED]> wrote:
>  On Mar 14, 2008, at 7:17 AM, Marko Kreen wrote:
>  > To put it to core Postgres, it needs to be conceptually sane
>  > first, without needing ugly workarounds to avoid it bringing
>  > whole db down.
>  >
>  > I can see ATM only few ways:
>  >
>  > - Applies only to non-superusers.
>  >
>  > - Error from CONNECT trigger does not affect superuser.
>  >
>  > - Applies to database + role.  Role could be also group of users.
>  >
>  > So you always have way do fix things, without hexediting in data
>  > dir...
>
> Another option:
>
>  Does not fire at all in single-user mode.  This would be covered by
>  "Applies to non-superusers" if that were there but, by itself, the
>  triggers would still fire for normal superuser connections.

Seems bit too hard - you may other db-s that work fine,
why should those suffer?

-- 
marko

-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] Trigger to run @ connection time?

2008-03-14 Thread Erik Jones


On Mar 14, 2008, at 7:17 AM, Marko Kreen wrote:


To put it to core Postgres, it needs to be conceptually sane
first, without needing ugly workarounds to avoid it bringing
whole db down.

I can see ATM only few ways:

- Applies only to non-superusers.

- Error from CONNECT trigger does not affect superuser.

- Applies to database + role.  Role could be also group of users.

So you always have way do fix things, without hexediting in data  
dir...


Another option:

Does not fire at all in single-user mode.  This would be covered by  
"Applies to non-superusers" if that were there but, by itself, the  
triggers would still fire for normal superuser connections.


Erik Jones

DBA | Emma®
[EMAIL PROTECTED]
800.595.4401 or 615.292.5888
615.292.0777 (fax)

Emma helps organizations everywhere communicate & market in style.
Visit us online at http://www.myemma.com




--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] Trigger to run @ connection time?

2008-03-14 Thread Marko Kreen
On 3/14/08, Dawid Kuroczko <[EMAIL PROTECTED]> wrote:
> On Thu, Mar 13, 2008 at 2:18 PM, Marko Kreen <[EMAIL PROTECTED]> wrote:
>  > On 3/13/08, Dawid Kuroczko <[EMAIL PROTECTED]> wrote:
> >  >  An application which uses tsearch2 ('SELECT set_curdict() / 
> > set_curcfg()' being
>  >  >  called upon session start).  That is fine and that works.
>  >  >
>  >  >  Now, using statement pooling solution like pgbouncer is great benefit 
> for this
>  >  >  specific application.  There is one little problem however -- one can 
> never be
>  >  >  sure when session is started.  As a countermeasure there is a need to 
> call
>  >  >  set_curdict() in every transaction (which is very fast), but one needs
>  >  >  to remember
>  >  >  to call that set_curdict() every time.
>  >  >
>  >  >  ON CONNECT trigger would solve that neatly!
>  >
>  >  Hm.  It seems to make more sense to implement connect-time
>  >  hook directly in pgbouncer.
>
> Indeed that would solve the issue.  But then again it could be argued that
>  PL/pgSQL could be implemented outside the backend as well. ;-)

Well, as the transaction-pooling breaks application expectations
and makes impossible for them to do initial setup, the connect
hook could give a way to compensate for that.

>  I see it as an addition which does have its applications.

To put it to core Postgres, it needs to be conceptually sane
first, without needing ugly workarounds to avoid it bringing
whole db down.

I can see ATM only few ways:

- Applies only to non-superusers.

- Error from CONNECT trigger does not affect superuser.

- Applies to database + role.  Role could be also group of users.

So you always have way do fix things, without hexediting in data dir...

-- 
marko

-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] Trigger to run @ connection time?

2008-03-13 Thread Dawid Kuroczko
On Thu, Mar 13, 2008 at 2:18 PM, Marko Kreen <[EMAIL PROTECTED]> wrote:
> On 3/13/08, Dawid Kuroczko <[EMAIL PROTECTED]> wrote:
>  >  An application which uses tsearch2 ('SELECT set_curdict() / set_curcfg()' 
> being
>  >  called upon session start).  That is fine and that works.
>  >
>  >  Now, using statement pooling solution like pgbouncer is great benefit for 
> this
>  >  specific application.  There is one little problem however -- one can 
> never be
>  >  sure when session is started.  As a countermeasure there is a need to call
>  >  set_curdict() in every transaction (which is very fast), but one needs
>  >  to remember
>  >  to call that set_curdict() every time.
>  >
>  >  ON CONNECT trigger would solve that neatly!
>
>  Hm.  It seems to make more sense to implement connect-time
>  hook directly in pgbouncer.

Indeed that would solve the issue.  But then again it could be argued that
PL/pgSQL could be implemented outside the backend as well. ;-)

I see it as an addition which does have its applications.

   Regards,
   Dawid

-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] Trigger to run @ connection time?

2008-03-13 Thread Marko Kreen
On 3/13/08, Dawid Kuroczko <[EMAIL PROTECTED]> wrote:
> On Tue, Mar 11, 2008 at 10:28 PM, Tom Lane <[EMAIL PROTECTED]> wrote:
>  > "Kynn Jones" <[EMAIL PROTECTED]> writes:
>  >  > If one can set up this insert operation so that it happens automatically
>  >  > whenever a new connection is made, I'd like to learn how it's done.
>  >
>  >  For manual psql sessions, you can put some setup commands in ~/.psqlrc.
>  >  In any other context I'm afraid you're stuck with modifying your client
>  >  application code.
>  >
>  >  An ON CONNECT trigger enforced by the database seems a bit scary to me.
>  >  If it's broken, how you gonna get into the DB to fix it?
>
>
> Well, I would benefit from ON CONNECT trigger, I must admit.
>
>  An application which uses tsearch2 ('SELECT set_curdict() / set_curcfg()' 
> being
>  called upon session start).  That is fine and that works.
>
>  Now, using statement pooling solution like pgbouncer is great benefit for 
> this
>  specific application.  There is one little problem however -- one can never 
> be
>  sure when session is started.  As a countermeasure there is a need to call
>  set_curdict() in every transaction (which is very fast), but one needs
>  to remember
>  to call that set_curdict() every time.
>
>  ON CONNECT trigger would solve that neatly!

Hm.  It seems to make more sense to implement connect-time
hook directly in pgbouncer.

-- 
marko

-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] Trigger to run @ connection time?

2008-03-13 Thread Daniel Verite

Tom Lane wrote:

For manual psql sessions, you can put some setup commands in 

~/.psqlrc.
In any other context I'm afraid you're stuck with modifying your 

client

application code.

An ON CONNECT trigger enforced by the database seems a bit scary to 

me.

If it's broken, how you gonna get into the DB to fix it?


At the protocol level, when the opening of a new session is requested, 
how about a "skip connect-trigger" run-time parameter? This parameter 
would be ignored (or an error being raised) if the connect isn't issued 
by the owner of the database or a superuser.
Within client applications, the functionality could then be implemented 
at the same level than the other connection parameters, I'm thinking of 
a checkbox in a GUI or an additional parameter to the \connect psql 
command.


By comparison, Oracle's solution to this is a grantable privilege that 
causes their "logon triggers" to ignore any error.


--
Daniel
PostgreSQL-powered mail user agent and storage: 
http://www.manitou-mail.org


--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] Trigger to run @ connection time?

2008-03-13 Thread Dawid Kuroczko
On Tue, Mar 11, 2008 at 10:28 PM, Tom Lane <[EMAIL PROTECTED]> wrote:
> "Kynn Jones" <[EMAIL PROTECTED]> writes:
>  > If one can set up this insert operation so that it happens automatically
>  > whenever a new connection is made, I'd like to learn how it's done.
>
>  For manual psql sessions, you can put some setup commands in ~/.psqlrc.
>  In any other context I'm afraid you're stuck with modifying your client
>  application code.
>
>  An ON CONNECT trigger enforced by the database seems a bit scary to me.
>  If it's broken, how you gonna get into the DB to fix it?

Well, I would benefit from ON CONNECT trigger, I must admit.

An application which uses tsearch2 ('SELECT set_curdict() / set_curcfg()' being
called upon session start).  That is fine and that works.

Now, using statement pooling solution like pgbouncer is great benefit for this
specific application.  There is one little problem however -- one can never be
sure when session is started.  As a countermeasure there is a need to call
set_curdict() in every transaction (which is very fast), but one needs
to remember
to call that set_curdict() every time.

ON CONNECT trigger would solve that neatly!

Wouldn't be enough to disallow ON COMMIT triggers for SUPERUSERs?
And a BIG FAT WARNING in documentation to wrap the trigger with
BEGIN ... EXCEPTION WHEN OTHERS RAISE NOTICE ... END, and have
a second user handy with proper permissions?

Dawid
-- 
Solving [site load issues] with [more database replication] is a lot
like solving your own personal
problems with heroin - at first it sorta works, but after a while
things just get out of hand.
 - Fred B. Schneider, PhD

-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] Trigger to run @ connection time?

2008-03-13 Thread Alban Hertroys

On Mar 13, 2008, at 2:00 AM, Berend Tober wrote:


Alban Hertroys wrote:

On Mar 11, 2008, at 10:28 PM, Tom Lane wrote:
An ON CONNECT trigger enforced by the database seems a bit scary  
to me.

If it's broken, how you gonna get into the DB to fix it?

regards, tom lane
If creating the trigger wouldn't be possible from within the  
database that it's defined for (which would be strange anyway as  
far as I'm concerned, since you are already connected at that  
point and thus missed an opportunity to fire that trigger) this  
shouldn't be a problem.

To put that into an SQL statement, something like:
#template1 $ CREATE TRIGGER my_database_connect_trg BEFORE CONNECT  
ON my_database EXECUTE PROCEDURE my_database_setup()
Although of course that begs the question where that procedure  
would be stored; Rather not in template1, I suppose! This points  
to another problem with ON CONNECT triggers, you'll likely need to  
be connected to reach the stored procedure that the trigger calls!  
A nice chicken and egg problem, with some scope issues on the  
horizon...


I envision this not so much as a BEFORE connect trigger, but rather  
as an event that happens after the point of the user being  
successfully authenticated, but before executing any user  
application commands -- in fact before even starting to listen for  
any incoming application commands.


It doesn't matter whether you're talking about a BEFORE or an AFTER  
trigger, that was just an example to illustrate the problem - which  
is the same for both cases.


What I was saying is that if the ON CONNECT trigger is defined in the  
database you're connecting to and it contains an error, there's  
nothing you can do to fix the error (starting with logging into that  
database). Which was what Tom pointed out already.


My idea around this was to define the ON CONNECT trigger outside the  
database you're connecting to, so that you'll at least be able to fix  
or disable the problematic code. It's a bit like the situation with  
PAM authentication to your (UNIX-based) OS - you can define your own  
authorisation methods, but if they are broken your only option is to  
boot into single-user mode and disable that part of authorisation. In  
Postgres template1 is a bit like single-user mode in UNIX.


Another option would be to not fire the trigger if a super user  
connects to the database, but that pretty much depends on what the  
trigger does, which is unknown by definition.


Thinking this over a bit more, it seems you're not so much looking  
for an ON CONNECT trigger, but for an ON AUTHORISE trigger. The  
problems remain pretty much the same though.


Regards,
Alban Hertroys

--
If you can't see the forest for the trees,
cut the trees and you'll see there is no forest.


!DSPAM:737,47d8d2ed233091559156500!



--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] Trigger to run @ connection time?

2008-03-12 Thread Berend Tober

Alban Hertroys wrote:

On Mar 11, 2008, at 10:28 PM, Tom Lane wrote:


An ON CONNECT trigger enforced by the database seems a bit scary to me.
If it's broken, how you gonna get into the DB to fix it?

regards, tom lane


If creating the trigger wouldn't be possible from within the database 
that it's defined for (which would be strange anyway as far as I'm 
concerned, since you are already connected at that point and thus missed 
an opportunity to fire that trigger) this shouldn't be a problem.


To put that into an SQL statement, something like:
#template1 $ CREATE TRIGGER my_database_connect_trg BEFORE CONNECT ON 
my_database EXECUTE PROCEDURE my_database_setup()


Although of course that begs the question where that procedure would be 
stored; Rather not in template1, I suppose! This points to another 
problem with ON CONNECT triggers, you'll likely need to be connected to 
reach the stored procedure that the trigger calls! A nice chicken and 
egg problem, with some scope issues on the horizon...


I envision this not so much as a BEFORE connect trigger, but 
rather as an event that happens after the point of the user being 
successfully authenticated, but before executing any user 
application commands -- in fact before even starting to listen 
for any incoming application commands.


A particular implementation I see this useful for, to give some 
context to thinking about this, is to update a user password 
expiration date (to, say, CURRENT_DATE + 30) at each login. This 
would then allow the creation of a system that lets unused 
accounts expire but automatically maintains the validity of 
actively used accounts, for example. I can think of other uses, too.


I currently achieve this functionality with an event triggered in 
an end-user application, but I'd really like it to happen in the 
data base so that every application that access this data base 
doesn't have to recreate that particular functionality -- and 
also so as to eliminate to problem of the functionality not being 
implemented by other applications outside our control that access 
the data base.





--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] Trigger to run @ connection time?

2008-03-12 Thread Alban Hertroys

On Mar 11, 2008, at 10:28 PM, Tom Lane wrote:

An ON CONNECT trigger enforced by the database seems a bit scary to  
me.

If it's broken, how you gonna get into the DB to fix it?

regards, tom lane


If creating the trigger wouldn't be possible from within the database  
that it's defined for (which would be strange anyway as far as I'm  
concerned, since you are already connected at that point and thus  
missed an opportunity to fire that trigger) this shouldn't be a problem.


To put that into an SQL statement, something like:
#template1 $ CREATE TRIGGER my_database_connect_trg BEFORE CONNECT ON  
my_database EXECUTE PROCEDURE my_database_setup()


Although of course that begs the question where that procedure would  
be stored; Rather not in template1, I suppose! This points to another  
problem with ON CONNECT triggers, you'll likely need to be connected  
to reach the stored procedure that the trigger calls! A nice chicken  
and egg problem, with some scope issues on the horizon...


Regards,
Alban Hertroys

--
If you can't see the forest for the trees,
cut the trees and you'll see there is no forest.


!DSPAM:737,47d85f64233091819183316!



--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] Trigger to run @ connection time?

2008-03-12 Thread Kynn Jones
On Tue, Mar 11, 2008 at 4:51 PM, Andrej Ricnik-Bay <[EMAIL PROTECTED]>
wrote:

> On 12/03/2008, Kynn Jones <[EMAIL PROTECTED]> wrote:
>  Of course I may not have quite
> understood how that  "this procedure adds useful definitions,
> mostly subs, to Perl's main package.  This needs to be done
> for each connection" is meant to work.
>

What I mean is illustrated by the following (extremely artificial and
clumsy) example:

CREATE OR REPLACE FUNCTION setup_perl () RETURNS void
AS $PERL$

  # globals
  $::TRUE = 1;
  $::FALSE = 0;

  {
my $leading_ws  = qr/\A\s*/;
my $trailing_ws = qr/\s*\z/;

# The next assignment defines the Perl function main::trim();
# it has almost the same effect as writing
# sub trim { ... }
# at the top level scope (in the main package), except that
# the definition happens at run time rather than at compile
# time.
*trim = sub {
  local $_ = shift;
  s/$leading_ws//;
  s/$trailing_ws//;
  return $_;
};
  }
$PERL$ LANGUAGE plperl IMMUTABLE;

CREATE OR REPLACE FUNCTION is_foo ( TEXT ) RETURNS BOOLEAN
AS $PERL$
  return trim( shift ) eq 'foo' ? $::TRUE : $::FALSE;
$PERL$ LANGUAGE plperl IMMUTABLE;

CREATE OR REPLACE FUNCTION is_bar ( TEXT ) RETURNS BOOLEAN
AS $PERL$
  return trim( shift ) eq 'bar' ? $::TRUE : $::FALSE;
$PERL$ LANGUAGE plperl IMMUTABLE;

Notice that is_foo() and is_bar() both rely on the *perl* function trim.
 They also refer to the Perl global variables $::TRUE and $::FALSE.  This
technique facilitates the reuse of Perl code in two ways.  First, individual
Perl subroutines can be defined once and called from various PLPERL
procedures.  Second, it simplifies the cut-and-paste porting of Perl code
(which often uses subroutines and global or file-scoped lexical variables)
straight into to PLPERL.  (I wrote more about this technique recently, in
the post with the subject line "On defining Perl functions within PLPERL
code.")

(BTW, notice that, the function trim is actually a closure: it uses a couple
of lexical variables, $leading_ws and $trailing_ws, that are defined in the
enclosing scope; i.e. these definitions need to happen only once.  Such
variables serve the same purpose as that of C static variables.  The ease of
defining such closures is an added bonus of this technique.  In this
artificial example, of course, this benefit is negligible, but when the
computation of such constants is time-consuming, this could be a useful
little optimization.)

Now, note that if we try to use is_foo() before invoking perl_setup(), it
will fail:

my_db=> select is_foo( '  foo  ' );
ERROR:  error from Perl function: Undefined subroutine &main::trim called at
line 2.

my_db=> select setup_perl();
 setup_perl


(1 row)

(BTW, is there a way to avoid the useless output above?)

my_db=> select is_foo( '  foo  ' );
 is_foo

 t
(1 row)

my_db=> select is_bar( '  foo  ' );
 is_bar

 f
(1 row)


That's why it would be nice to run perl_setup() automatically at the
beginning of each session.  Granted, one workaround would be to include the
line

  spi_query( 'SELECT setup_perl()' ) unless $::TRUE;

at the top of ever PLPERL function that required the definitions provided by
setup_perl().  Something like an ON CONNECT trigger would obviate this small
annoyance, but I guess that's not a possibility at the moment.

Kynn


Re: [GENERAL] Trigger to run @ connection time?

2008-03-12 Thread Greg Sabino Mullane

-BEGIN PGP SIGNED MESSAGE-
Hash: RIPEMD160


> Hi!  I want to set up a trigger (somehow) that, whenever someone connects
> database my_db, will fire and thereby run a stored PLPERL procedure
> perl_setup() in the new connection's environment.  (BTW, this procedure adds
> useful definitions, mostly subs, to Perl's main package.  This needs to be
> done for each connection, because such modifications of package main do not
> persist from one session to the next.)

I think you are going about this the wrong way. Create a hook in each plperl
func that does the initial setup for you as needed. Simply store a
value in $_SHARED indicating whether it has already run or not for that
session. This also avoid any overhead at all of calling perl_setup() if
the connection in question is never going to use plperl, or even if it is
going to use plperl but does not need perl_setup().

- --
Greg Sabino Mullane [EMAIL PROTECTED]
PGP Key: 0x14964AC8 200803121042
http://biglumber.com/x/web?pk=2529DF6AB8F79407E94445B4BC9B906714964AC8


-BEGIN PGP SIGNATURE-

iEYEAREDAAYFAkfX6+0ACgkQvJuQZxSWSsiFdQCg4WGmB4+InrL7E+7c8Tq82lFy
TFcAn2lQfSXJwO8LUQ9vZPf9ZStLdVHW
=R5fK
-END PGP SIGNATURE-



-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] Trigger to run @ connection time?

2008-03-12 Thread Karsten Hilbert
On Wed, Mar 12, 2008 at 07:52:29AM -0400, Kynn Jones wrote:

> > An ON CONNECT trigger enforced by the database seems a bit scary to me.
> > If it's broken, how you gonna get into the DB to fix it?

A "psql --skip-on-connect-trigger", only available to, say,
superusers ? Or a database flag (like the "accepts
connections" one) editable by superusers when connected to
another database ?

Karsten
-- 
GPG key ID E4071346 @ wwwkeys.pgp.net
E167 67FD A291 2BEA 73BD  4537 78B9 A9F9 E407 1346

-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] Trigger to run @ connection time?

2008-03-12 Thread btober

Kynn Jones wrote:

On Tue, Mar 11, 2008 at 5:28 PM, Tom Lane <[EMAIL PROTECTED]> wrote:


"Kynn Jones" <[EMAIL PROTECTED]> writes:

If one can set up this insert operation so that it happens automatically
whenever a new connection is made, I'd like to learn how it's done.

For manual psql sessions, you can put some setup commands in ~/.psqlrc.
In any other context I'm afraid you're stuck with modifying your client
application code.

An ON CONNECT trigger enforced by the database seems a bit scary to me.
If it's broken, how you gonna get into the DB to fix it?



I guess I don't know just *how broken* a trigger can be :-) !  I guess what
you're saying is that a trigger can be *so badly broken* that, even if
executed in response to a regular INSERT/UPDATE/DELETE event, it would
disable the database to the point that the only recourse would be to kill
the connection and open a new one.  Such a trigger, if it were associated
with an CONNECT event, would render the database inaccessible.  It follows
from Murphy's law that triggers that are this broken are certainly
possible...


I've been interested in an ON CONNECT trigger, too.

My suggestion regarding the scary problem noted above is that there 
would have to be a configuration setting in postgresql.conf to enable or 
disable the trigger so that if a broken trigger killed the data base, 
you could recover by modifying the configuration file so as to disable 
the trigger and then successfully restart the data base.


The problem with the suggested work-around implementation of modifying 
the client application code is that the (pseudo-)trigger is only fired 
if the data base is accessed by means of that specifically-rigged-up 
application. It would not fire if someone went in via a utility like 
pgAdmin III, or psql, for example. And since a really useful data base 
is likely to have multiple applications running against it anyway, they 
would all have to consistently duplicate the pseudo-trigger code.


-- BMT

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] Trigger to run @ connection time?

2008-03-12 Thread Kynn Jones
On Tue, Mar 11, 2008 at 5:28 PM, Tom Lane <[EMAIL PROTECTED]> wrote:

> "Kynn Jones" <[EMAIL PROTECTED]> writes:
> > If one can set up this insert operation so that it happens automatically
> > whenever a new connection is made, I'd like to learn how it's done.
>
> For manual psql sessions, you can put some setup commands in ~/.psqlrc.
> In any other context I'm afraid you're stuck with modifying your client
> application code.
>
> An ON CONNECT trigger enforced by the database seems a bit scary to me.
> If it's broken, how you gonna get into the DB to fix it?


I guess I don't know just *how broken* a trigger can be :-) !  I guess what
you're saying is that a trigger can be *so badly broken* that, even if
executed in response to a regular INSERT/UPDATE/DELETE event, it would
disable the database to the point that the only recourse would be to kill
the connection and open a new one.  Such a trigger, if it were associated
with an CONNECT event, would render the database inaccessible.  It follows
from Murphy's law that triggers that are this broken are certainly
possible...

Which is a long-winded way to say that I see your point!

Kynn


Re: [GENERAL] Trigger to run @ connection time?

2008-03-11 Thread Tom Lane
"Kynn Jones" <[EMAIL PROTECTED]> writes:
> If one can set up this insert operation so that it happens automatically
> whenever a new connection is made, I'd like to learn how it's done.

For manual psql sessions, you can put some setup commands in ~/.psqlrc.
In any other context I'm afraid you're stuck with modifying your client
application code.

An ON CONNECT trigger enforced by the database seems a bit scary to me.
If it's broken, how you gonna get into the DB to fix it?

regards, tom lane

-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] Trigger to run @ connection time?

2008-03-11 Thread Andrej Ricnik-Bay
On 12/03/2008, Kynn Jones <[EMAIL PROTECTED]> wrote:

> If one can set up this insert operation so that it happens automatically
> whenever a new connection is made, I'd like to learn how it's done.  But if
> not, then I don't see how performing the insert "manually" every time one
> connects would be any easier than simply executing the perl_setup()
> procedure directly.
After having thought about this for a few seconds  you
could conceivably use some OS/DB integration to achieve this.
Just make sure postmaster writes new connections to a log,
monitor that log from a script, and if it sees a "connect" have
that insert a value into "special table" of yours that then can
do the trigger you looked for?   Of course I may not have quite
understood how that  "this procedure adds useful definitions,
mostly subs, to Perl's main package.  This needs to be done
for each connection" is meant to work.


Cheers,
Andrej



-- 
Please don't top post, and don't use HTML e-Mail :}  Make your quotes concise.

http://www.american.edu/econ/notes/htmlmail.htm

-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] Trigger to run @ connection time?

2008-03-11 Thread Kynn Jones
On Mon, Mar 10, 2008 at 7:47 PM, Alban Hertroys <
[EMAIL PROTECTED]> wrote:

>
> You can't define triggers on system tables.
>

Oh, well... :-/  Thanks for the reality check!

> If not, is there some other way to set up a trigger that
>

Oops.  I guess a cut-and-paste error in my original message must have caused
some text to be lost.  I meant to write

> If not, is there some other way to set up a trigger that will run whenever
> a new connection to my_db is
>
> established?
>

One could be forgiven for not being able to figure out what I was asking,
but, if, in spite of the huge typo, you were in fact able to guess what I
had meant to ask, then I'm confused by your suggestion here:


> Closest thing I can think of is defining a table that you insert a
> record in as soon as you connect and put a trigger on that.
>

If one can set up this insert operation so that it happens automatically
whenever a new connection is made, I'd like to learn how it's done.  But if
not, then I don't see how performing the insert "manually" every time one
connects would be any easier than simply executing the perl_setup()
procedure directly.

Kynn


Re: [GENERAL] Trigger to run @ connection time?

2008-03-10 Thread Alban Hertroys

On Mar 10, 2008, at 9:07 PM, Kynn Jones wrote:

So I tried to find some system table that would get modified  
whenever a new connection was made, but I was unsuccessful.  The  
closest I found was the VIEW pg_activity, and the crucial  
information I need from this view comes from procedures like  
pg_stat_get_backend_pid().


You can't define triggers on system tables.

Is there a bona fide table (not a view!) that I could use to define  
an "on connect" trigger?  (This table would not only have to  
undergo some INSERT or UPDATE event at the time of the new  
connection, but it should also provide enough information to allow  
my code to determine which database is being connected to.)


I'm afraid not, although there's been mention on this ML of on  
connect triggers before. Not sure whether that got solved though...



If not, is there some other way to set up a trigger that


Closest thing I can think of is defining a table that you insert a  
record in as soon as you connect and put a trigger on that.


Alban Hertroys

--
If you can't see the forest for the trees,
cut the trees and you'll see there is no forest.


!DSPAM:737,47d5c63d233091216612506!



--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


[GENERAL] Trigger to run @ connection time?

2008-03-10 Thread Kynn Jones
Hi!  I want to set up a trigger (somehow) that, whenever someone connects
database my_db, will fire and thereby run a stored PLPERL procedure
perl_setup() in the new connection's environment.  (BTW, this procedure adds
useful definitions, mostly subs, to Perl's main package.  This needs to be
done for each connection, because such modifications of package main do not
persist from one session to the next.)

I figured that setting up such a trigger would be possible, based on the
naive assumption that all global events of interest (e.g. the opening (or
closing) of a connection to a specific database, or the creation of a new
database) would correspond to an INSERT, UPDATE, or DELETE event on some
system table.

So I tried to find some system table that would get modified whenever a new
connection was made, but I was unsuccessful.  The closest I found was the
VIEW pg_activity, and the crucial information I need from this view comes
from procedures like pg_stat_get_backend_pid().

Is there a bona fide table (not a view!) that I could use to define an "on
connect" trigger?  (This table would not only have to undergo some INSERT or
UPDATE event at the time of the new connection, but it should also provide
enough information to allow my code to determine which database is being
connected to.)

If not, is there some other way to set up a trigger that

TIA!

Kynn