Re: sudo-like behavior - Mailing list pgsql-general
From | Agent M |
---|---|
Subject | Re: sudo-like behavior |
Date | |
Msg-id | 6530c279ddbce40eac5e4d8686f84b25@themactionfaction.com Whole thread Raw |
In response to | Re: sudo-like behavior (Tom Lane <tgl@sss.pgh.pa.us>) |
Responses |
Re: sudo-like behavior
|
List | pgsql-general |
I really haven't provided enough details- my fault. What I want to accomplish is a general-purpose timer facility for postgresql. Ideally, arbitrary roles provide statements to run at certain intervals. The benefit here is that the user connections can go away and only a single timer connection is maintained (waiting on notifications to update). Examples of where this could be useful: 1) simulated materialized views 2) daily tasks such as cache cleanup/refresh/updates 3) expensive tasks which run regularly Arbitrary statements could be executed on a timed basis without needing local access for crontab or persistent remote access. Anyway, here is the table: CREATE TABLE pgtimer._timer ( id SERIAL PRIMARY KEY, repeats INTEGER NOT NULL, --repeats X times as countdown lastfired TIMESTAMP, waitinterval INTERVAL, --OR specialeventid INTEGER REFERENCES pgtimer.specialevent, --various special events such as startup, autovacuum, or notifications detail TEXT, --stores notification event name if applicable statement TEXT NOT NULL, asrole TEXT NOT NULL ); A separate view with rules handles insert/update capabilities and throws a notification so that the daemon is notified to refresh its countdown to the next event. The actual statement execution is all I have left to do. I could force users to define security definer functions but then vacuuming capability is lost (autovacuum can't handle everything). If there is an architecture change I could make to rectify this, I am all ears. Thanks! -M On Apr 20, 2006, at 5:03 PM, Tom Lane wrote: > "A.M." <agentm@themactionfaction.com> writes: >> On Thu, April 20, 2006 4:21 pm, Tom Lane wrote: >>> I think the correct way to do what you want is via a SECURITY DEFINER >>> function. > >> Perhaps I can't wrap my head around it- I have the SQL as a string in >> a >> table. > > Well, the simplest thing would be > > create function exec(text) returns void as $$ > begin > execute $1; > end$$ language plpgsql strict security definer; > > revoke execute on exec(text) from public; > grant execute on exec(text) to whoever-you-trust; > > although personally I'd try to restrict what the function can be used > for a bit more than that. If the allowed commands are in a table, you > could perhaps pass the table's key to exec() and let it pull the string > from the table for itself. > >> What about commands that can't be run from within transactions? > > There aren't that many of those. Do you really need this for them? > > For that matter, do you really need this at all? Have you considered > granting role membership as an alternative solution path? The SQL > permissions mechanism is quite powerful as of 8.1, and if it won't > do what you want, maybe you have not thought hard enough. > > regards, tom lane > ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ AgentM agentm@themactionfaction.com ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬
pgsql-general by date: