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