Robert Haas <robertmh...@gmail.com> writes: > I actually think that, to really meet all needs here, we may need the > ability to get control in more than one place. For example, one thing > that KaiGai has wanted to do (and I bet Dimitri would live to be able > to do it too, and I'm almost sure that Dan Farina would like to do it) > is override the built-in security policy for particular commands. I
I had that in a previous version of the patch, and removed it because you were concerned about our ability to review it in time for 9.2, which has obviously been a right decision. That was called INSTEAD OF command triggers, and they could call a SECURITY DEFINER function. > I agree that it's not a very helpful decision, but I'm not the one who > said we wanted command triggers rather than event triggers. :-) Color me unconvinced about event triggers. That's not answering my use cases. > that. But how is that any different with Dimitri's approach? You can > get a callback AFTER CREATE TABLE, and you'll get the table name. Now > what? If you get the trigger in C you can get the node tree, but > that's hardly any better. You're still going to need to do some > pretty tricky push-ups to get reliable replication. It's not at all What you do with the parse tree is rewrite the command. It's possible to do, but would entail exposing the internal parser state which Tom objects too. I'm now thinking that can be maintained as a C extension. > evident to me that the parse-tree is any better a place to start than > the system catalog representation; in fact, I would argue that it's > probably much worse, because you'll have to exactly replicate whatever > the backend did to decide what catalog entries to create, or you'll > get drift between servers. Try to build a command string from the catalogs… even if you can store a snapshot of them before and after the command. Remember that you might want to “replicate” to things that are NOT a PostgreSQL server. > ambiguity. If you say that we're going to have a trigger on the > CREATE SEQUENCE command, then what happens when the user creates a > sequence via some other method? The current patch says that we should > handle that by calling the CREATE SEQUENCE trigger if it happens to be > convenient because we're going through the same code path that a > normal CREATE SEQUENCE would have gone through, but if it uses a > different code path then let's not bother. Otherwise, how do you Yes, the current set of which commands fire which triggers is explained by how the code is written wrt standard_ProcessUtility() calls. We could mark re-entrant calls and disable the command trigger feature, it would not be our first backend global variable in flight. > Dimitri is not the first or last person to want to get control during > DDL operations, and KaiGai's already done a lot of work figuring out > how to make it work reasonably. Pre-create hooks don't exist in that > machinery not because nobody wants them, but because it's hard. This I've been talking with Kaigai about using the Command Trigger infrastructure to implement its control hooks, while reviewing one of his patches, and he said that's not low-level enough for him. > whole problem is hard. It would be wrong to paint it as a problem > that is unsolvable or not valuable, but it would be equally wrong to > expect that it's easy or that anyone's first attempt (mine, yours, > Dimitri's, KaiGai's, or Tom Lane's) is going to fall painlessly into > place without anyone needing to sweat a little blood. Sweating over that feature is a good summary of a whole lot of my and some others' time lately. Regards, -- Dimitri Fontaine http://2ndQuadrant.fr PostgreSQL : Expertise, Formation et Support -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers