Scott,

I implemented a system exactly like this for the app in my signature below. 
Basically the system stores metadata containing each view definition and the 
joins between them. When someone needs to alter a view, say to remove a column, 
a DROP CASCADE is performed then each view is recreated in turn *in the correct 
order*. Everything's in a transaction, so a failure of recreation will roll 
back to the original state. This can of course happen if for example a column 
is deleted which other views use. This method is only used if the original 
attempt fails due to dependency errors - some view updates can work just fine 
anyway.

I can point you to the relevant code in GitHub if you're interested (it's Java).

Regards
Oliver Kohll

oli...@agilebase.co.uk / +44(0)7814 828608 / skype:okohll
www.agilebase.co.uk - software
www.gtwm.co.uk - company


On 24 Apr 2010, at 13:01, Scott Bailey <arta...@comcast.net> wrote:

> Using views in Postgres can be a painful process. Changing a column in a base 
> table will require you to drop all views that depend on it, and all views 
> that depend on those views and so on.
> 
> My coworker was complaining this morning that he now has a bunch of queries 
> where a view is joined back on the original table to add a column that was 
> missing from the view. It was easier to do this than to drop the view and all 
> of it's dependencies and then find all the source code and rebuild all of the 
> views in the correct order.
> 
> So my thought was to create an invalid objects table to store the source and 
> dependencies (and possibly permissions) when a DDL change invalidates a view 
> or a function. And later you can call a procedure that (tries to) rebuild 
> those invalid objects.
> 
> My initial plan of attack is to just create a function that stores the 
> information required to rebuild the dependencies before dropping them. 
> Something like:
>  store_and_drop('my_view_name')
> 
> I'm thinking that ultimately it would be nice if postgres could do this 
> automatically. Maybe:
>  DROP my_view_name CASCADE WITH RESTORE
> 
> So before I begin, has anyone already done this? And does anyone have any 
> advice as to how it may best be done?
> 
> Thanks
> 
> Scott Bailey


Reply via email to