Thread: view management

view management

From
"Ed L."
Date:
I have a question about view management...

I often have need for views that reference views that reference
views, and so on.  When I need to make a small update to one of
the views, I am faced with having to drop and recreate all
dependent views even if the driving change just adds another
column to the view, for example.  I might have to drop and
recreate many tens of views just to make a change to a single
view.  What a PITA.  How do others manage this?

TIA.
Ed

Re: view management

From
"Joshua D. Drake"
Date:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Fri, 16 Nov 2007 13:57:24 -0700
"Ed L." <pgsql@bluepolka.net> wrote:

> I have a question about view management... 
> 
> I often have need for views that reference views that reference 
> views, and so on.  When I need to make a small update to one of 
> the views, I am faced with having to drop and recreate all 
> dependent views even if the driving change just adds another 
> column to the view, for example.  I might have to drop and 
> recreate many tens of views just to make a change to a single 
> view.  What a PITA.  How do others manage this?

I use stored procedures instead.

Joshua D. Drake

> 
> TIA.
> Ed
> 
> ---------------------------(end of
> broadcast)--------------------------- TIP 9: In versions below 8.0,
> the planner will ignore your desire to choose an index scan if your
> joining column's datatypes do not match
> 


- -- 

      === The PostgreSQL Company: Command Prompt, Inc. ===
Sales/Support: +1.503.667.4564   24x7/Emergency: +1.800.492.2240
PostgreSQL solutions since 1997  http://www.commandprompt.com/
            UNIQUE NOT NULL
Donate to the PostgreSQL Project: http://www.postgresql.org/about/donate
PostgreSQL Replication: http://www.commandprompt.com/products/

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQFHPgUMATb/zqfZUUQRAneuAJ9I4FByzPC3fSCwWdwjhEfQtdFpKwCfYDkv
IvL6KnBrOeqpUj6qKBkd8iE=
=Se2S
-----END PGP SIGNATURE-----

Re: view management

From
"Ed L."
Date:
On Friday 16 November 2007 1:57 pm, Ed L. wrote:
> I have a question about view management...
>
> I often have need for views that reference views that
> reference views, and so on.  When I need to make a small
> update to one of the views, I am faced with having to drop and
> recreate all dependent views even if the driving change just
> adds another column to the view, for example.  I might have to
> drop and recreate many tens of views just to make a change to
> a single view.  What a PITA.  How do others manage this?

And before you tell me all about DROP VIEW ... CASCADE, please
note I'm not talking about that.  I'm talking about the
difficulties of having to recreate all views in the entire
subtree of view dependencies just to change one minor aspect of
an independent view.

TIA...
Ed

Re: view management

From
Andrew Sullivan
Date:
On Fri, Nov 16, 2007 at 02:02:37PM -0700, Ed L. wrote:
> subtree of view dependencies just to change one minor aspect of
> an independent view.

Well, it's not independent, if other things depend on it, is it?

:)

A

--
Andrew Sullivan
Old sigs will return after re-constitution of blue smoke

Re: view management

From
"Merlin Moncure"
Date:
On Nov 16, 2007 4:02 PM, Ed L. <pgsql@bluepolka.net> wrote:
> On Friday 16 November 2007 1:57 pm, Ed L. wrote:
> > I have a question about view management...
> >
> > I often have need for views that reference views that
> > reference views, and so on.  When I need to make a small
> > update to one of the views, I am faced with having to drop and
> > recreate all dependent views even if the driving change just
> > adds another column to the view, for example.  I might have to
> > drop and recreate many tens of views just to make a change to
> > a single view.  What a PITA.  How do others manage this?
>
> And before you tell me all about DROP VIEW ... CASCADE, please
> note I'm not talking about that.  I'm talking about the
> difficulties of having to recreate all views in the entire
> subtree of view dependencies just to change one minor aspect of
> an independent view.

you have to rig a build system.  if you have a lot of views (which is
good), and keeping them up to date is a pain, you have to automate
their creation. simplest way to do that is to rig a build system
around sql scripts.  when you create a view the first time, save it's
creation script in a .sql file and replay that when you need it.   if
you like to get fancy, you can always work solutions around make, etc
on top of this.  there are other tricks...for example you could grep
object dropped by the database and replay them.

avoid gui tools for heavy management...the are the antithesis of this
kind of approach.

merlin

Re: view management

From
"Merlin Moncure"
Date:
On Nov 16, 2007 4:01 PM, Joshua D. Drake <jd@commandprompt.com> wrote:
> On Fri, 16 Nov 2007 13:57:24 -0700
> "Ed L." <pgsql@bluepolka.net> wrote:
>
> > I have a question about view management...
> >
> > I often have need for views that reference views that reference
> > views, and so on.  When I need to make a small update to one of
> > the views, I am faced with having to drop and recreate all
> > dependent views even if the driving change just adds another
> > column to the view, for example.  I might have to drop and
> > recreate many tens of views just to make a change to a single
> > view.  What a PITA.  How do others manage this?
>
> I use stored procedures instead.

IMO, this approach has a lot of problems...not only does it force you
to think of your database access in terms of inputs and outputs in
advance.  Furthermore it can force your queries using the functions
into awkward or suboptimal plans.  I think functions are appropriate
for certain tasks that are better handled in procedural manner for
various reasons, but it's very good style to keep applications
interfacing to the database as much as possible through views.  All
procedure access is ok, but is too much abstraction and creates
headaches down the line.  Furthermore, it hides the problem asked by
the OP, not solves it, since the database merely forces you to check
the dependencies by creating the view, whereas functions displace that
check down the line which might result in missed dependency issues.

merlin

Re: view management

From
"Ed L."
Date:
On Friday 16 November 2007 2:09 pm, Merlin Moncure wrote:
> you have to rig a build system.  if you have a lot of views
> (which is good), and keeping them up to date is a pain, you
> have to automate their creation. simplest way to do that is to
> rig a build system around sql scripts.  when you create a view
> the first time, save it's creation script in a .sql file and
> replay that when you need it.   if you like to get fancy, you
> can always work solutions around make, etc on top of this.
>  there are other tricks...for example you could grep object
> dropped by the database and replay them.

That looks about as ugly as can be.  Ugh.  What it appears to
boil down to is that views become unusable unless you are
willing to invest the effort in a complex build system.  The DB
should handle this issue automatically.  Does Oracle?

There is a slightly related todo item:

-------
# Allow VIEW/RULE recompilation when the underlying tables change

Another issue is whether underlying table changes should be
reflected in the view, e.g. should SELECT * show additional
columns if they are added after the view is created.
-------

Looks like a tricky problem.  What I think is needed is some sort
of column-level linkage tracking between views, rather than just
view-level dependencies.  For example,

create table foo (id integer, msg varchar);
create table bar (id integer, msg varchar);
create view fooview as select id from foo;
create view barview as
    select b.*, f.id as fooid
    from bar b join fooview f on b.id = f.id;

When barview is created, f.id would need to be noted as depending
on fooview.id rather than just noting barview depends on
fooview.  Then, if someone decides to recreate fooview to
include foo.msg, it can be discerned that the change will not
impact barview at all.  That approach looks far too simple to
have not been done already.

Re: view management

From
"Scott Marlowe"
Date:
On Nov 16, 2007 3:43 PM, Ed L. <pgsql@bluepolka.net> wrote:
>
> That looks about as ugly as can be.  Ugh.  What it appears to
> boil down to is that views become unusable unless you are
> willing to invest the effort in a complex build system.  The DB
> should handle this issue automatically.  Does Oracle?

Really?  I find a build system to be a pretty necessary part of
enterprise development.  I can't imagine trying to keep track of what
I've done to my db without using some kind of simple .sql scripts with
all my ddl in them.

And I use views and user defined functions a lot.

Re: view management

From
"Merlin Moncure"
Date:
On Nov 16, 2007 4:43 PM, Ed L. <pgsql@bluepolka.net> wrote:
> On Friday 16 November 2007 2:09 pm, Merlin Moncure wrote:
> > you have to rig a build system. if you have a lot of views
> > (which is good), and keeping them up to date is a pain, you
> > have to automate their creation. simplest way to do that is to
> > rig a build system around sql scripts. when you create a view
> > the first time, save it's creation script in a .sql file and
> > replay that when you need it. if you like to get fancy, you
> > can always work solutions around make, etc on top of this.
> > there are other tricks...for example you could grep object
> > dropped by the database and replay them.
>
> That looks about as ugly as can be.  Ugh.  What it appears to
> boil down to is that views become unusable unless you are
> willing to invest the effort in a complex build system.  The DB
> should handle this issue automatically.  Does Oracle?

it's not as bad as it looks...but simply keeping your 'create views'
in scripts should be enough.  other advantages include ability to
track schema object changes in source code.

> There is a slightly related todo item:
> # Allow VIEW/RULE recompilation when the underlying tables change
>
> Another issue is whether underlying table changes should be
> reflected in the view, e.g. should SELECT * show additional
> columns if they are added after the view is created.

personally, what I would like would be to have the original text of
the view to be stored and replayed by the database in this scenario.
if you do '\d' on a view you may notice that the definition, while
correct, is significantly mangled for some types of queries.  this
would also solve the 'select *' issue, which is extremely desirable in
some cases and you could control it in the original create view
statement.

merlin

Re: view management

From
Andrew Sullivan
Date:
On Fri, Nov 16, 2007 at 02:43:01PM -0700, Ed L. wrote:
> That looks about as ugly as can be.  Ugh.  What it appears to
> boil down to is that views become unusable unless you are
> willing to invest the effort in a complex build system.  The DB

You're kidding, right?  You don't think that a build system, along with
change control, for your schema is a good thing?

A

--
Andrew Sullivan
Old sigs will return after re-constitution of blue smoke

Re: view management

From
"Ed L."
Date:
On Friday 16 November 2007 2:48 pm, Scott Marlowe wrote:
> On Nov 16, 2007 3:43 PM, Ed L. <pgsql@bluepolka.net> wrote:
> > That looks about as ugly as can be.  Ugh.  What it appears
> > to boil down to is that views become unusable unless you are
> > willing to invest the effort in a complex build system.  The
> > DB should handle this issue automatically.  Does Oracle?
>
> Really?  I find a build system to be a pretty necessary part
> of enterprise development.  I can't imagine trying to keep
> track of what I've done to my db without using some kind of
> simple .sql scripts with all my ddl in them.
>
> And I use views and user defined functions a lot.

The overall schema upgrade management system is not the difficult
part.  I find the difficulty comes with, for example, 5 levels
of view dependencies.  The view you want to update requires you
to rebuild 15 others, which in turn requires you to trace back
another 15 views, and so on until you reach the leafs of the
tree.  You don't know those dependencies when you create the
first few views.  Maybe you just manually discover all these
dependency paths each time you decide to change a view with
dependencies.  That's the part I'm griping about and for which I
was hoping for a better way.

Re: view management

From
Justin Pasher
Date:
Ed L. wrote:
> On Friday 16 November 2007 2:48 pm, Scott Marlowe wrote:
>
>> On Nov 16, 2007 3:43 PM, Ed L. <pgsql@bluepolka.net> wrote:
>>
>>> That looks about as ugly as can be.  Ugh.  What it appears
>>> to boil down to is that views become unusable unless you are
>>> willing to invest the effort in a complex build system.  The
>>> DB should handle this issue automatically.  Does Oracle?
>>>
>> Really?  I find a build system to be a pretty necessary part
>> of enterprise development.  I can't imagine trying to keep
>> track of what I've done to my db without using some kind of
>> simple .sql scripts with all my ddl in them.
>>
>> And I use views and user defined functions a lot.
>>
>
> The overall schema upgrade management system is not the difficult
> part.  I find the difficulty comes with, for example, 5 levels
> of view dependencies.  The view you want to update requires you
> to rebuild 15 others, which in turn requires you to trace back
> another 15 views, and so on until you reach the leafs of the
> tree.  You don't know those dependencies when you create the
> first few views.  Maybe you just manually discover all these
> dependency paths each time you decide to change a view with
> dependencies.  That's the part I'm griping about and for which I
> was hoping for a better way.
>


We have a system that has quite a few views to access some of the data
(although we purposely tried to avoid views that pulled from other view
due to some performance issues), but when we had all of the view
interdependencies, we had a simple shell script that ran through a list
of SQL files and imported them one after the other. If we every had to
drop a view that cascaded to other dependent views, we would just do the
DROP VIEW ... CASCADE, then run the shell script to recreate all of the
views. In your situation, the time consuming part would be the initial
creation of the script to get the SQL files in the correct order. After
that is done, it's just a matter of proper maintenance to keep it working.

Justin

Re: view management

From
"Ed L."
Date:
Thanks, Justin.

On Friday 16 November 2007 4:38 pm, Justin Pasher wrote:
> We have a system that has quite a few views to access some of
> the data (although we purposely tried to avoid views that
> pulled from other view due to some performance issues), but
> when we had all of the view interdependencies, we had a simple
> shell script that ran through a list of SQL files and imported
> them one after the other. If we every had to drop a view that
> cascaded to other dependent views, we would just do the DROP
> VIEW ... CASCADE, then run the shell script to recreate all of
> the views. In your situation, the time consuming part would be
> the initial creation of the script to get the SQL files in the
> correct order. After that is done, it's just a matter of
> proper maintenance to keep it working.

Re: view management

From
Jorge Godoy
Date:
Em Friday 16 November 2007 18:57:24 Ed L. escreveu:
>
> I often have need for views that reference views that reference
> views, and so on.  When I need to make a small update to one of
> the views, I am faced with having to drop and recreate all
> dependent views even if the driving change just adds another
> column to the view, for example.  I might have to drop and
> recreate many tens of views just to make a change to a single
> view.  What a PITA.  How do others manage this?

I have the same problem.

DB2 does have some kind of path invalidation where you have to recreate the
path to make your views usable again.

So, it is possible to work with views like "SELECT * FROM table" to leverage
table changes and things like that.

If PostgreSQL had similar resources to "block" the usage of a (some) view(s)
until another command was issued to prevent that need of dropping and
recreating all dependent objects it would be great.

A suboptimal alternative would be allowing the number of columns be greater
than it was before -- i.e., add new columns to the view --, but block name
changes for those columns and removing columns.

--
Jorge Godoy      <jgodoy@gmail.com>