Thread: Dynamic views

Dynamic views

From
Date:
Hello friends,
I have a view defined as:-

CREATE VIEW vivek_testview AS SELECT vivek_test.* , users.username AS name from users, vivek_test where
vivek_test.username=users.username;

Now, when I add a new column in vivek_test, I cant see the new column in the view. Currently we have to drop the view
andrecreate it.  
Is there a way that i can see the new column without dropping and recreating the view ?

Thanks for reading this. Thanks for your replies in advance.



With warm regards.
Vivek

vivek@staff.ownmail.com

All science is either physics or stamp collecting.
                -- Ernest Rutherford




Re: Dynamic views

From
"Merlin Moncure"
Date:
On 11/29/06, vivek@staff.ownmail.com <vivek@staff.ownmail.com> wrote:
> Hello friends,
> I have a view defined as:-
>
> CREATE VIEW vivek_testview AS SELECT vivek_test.* , users.username AS name from users, vivek_test where
vivek_test.username=users.username;
>
> Now, when I add a new column in vivek_test, I cant see the new column in the view. Currently we have to drop the view
andrecreate it. 
> Is there a way that i can see the new column without dropping and recreating the view ?
>
> Thanks for reading this. Thanks for your replies in advance.

no, queries using * are expanded when the plan is created.  for views,
the plan is created when you create the view (also the original query
string to create the view is not stored).  however, you could however
create a function that returns setof record, because plans for
functions are created when they are first run in a session.  this
isn't a perfect solution, but it might work for you.

merlin

Re: Dynamic views

From
"Merlin Moncure"
Date:
On 11/29/06, Bernd Helmle <mailings@oopsware.de> wrote:
> > no, queries using * are expanded when the plan is created.  for views,
> > the plan is created when you create the view (also the original query
> > string to create the view is not stored).  however, you could however
> > create a function that returns setof record, because plans for
> > functions are created when they are first run in a session.  this
> > isn't a perfect solution, but it might work for you.
>
> But that requires to adjust all SELECTs which uses this table function, since
>
> SETOF RECORD requires you to specify a column list. Maybe you can build
>
> something like that using a table's implicit type.

correct:

create table foo (a text, b int, c int);
insert into foo values ('1', 2, 3);
create function f() returns setof foo as $$ select * from foo; $$ language sql;
select f();
    f
---------
 (1,2,3)
(1 row)

alter table foo add column d int default 4;

select * from f();
 a | b | c | d
---+---+---+---
 1 | 2 | 3 | 4

merlin

Re: Dynamic views

From
Bernd Helmle
Date:


On Wed, 29 Nov 2006 18:38:22 +0530, "Merlin Moncure" <mmoncure@gmail.com> wrote:
> On 11/29/06, vivek@staff.ownmail.com <vivek@staff.ownmail.com> wrote:
>> Hello friends,
>> I have a view defined as:-
>>
>> CREATE VIEW vivek_testview AS SELECT vivek_test.* , users.username AS
> name from users, vivek_test where vivek_test.username=users.username;
>>
>> Now, when I add a new column in vivek_test, I cant see the new column in
> the view. Currently we have to drop the view and recreate it.
>> Is there a way that i can see the new column without dropping and
> recreating the view ?
>>

No, not easy. Do you have to change your database schema that often?

>> Thanks for reading this. Thanks for your replies in advance.
>
> no, queries using * are expanded when the plan is created.  for views,
> the plan is created when you create the view (also the original query
> string to create the view is not stored).  however, you could however
> create a function that returns setof record, because plans for
> functions are created when they are first run in a session.  this
> isn't a perfect solution, but it might work for you.
>

But that requires to adjust all SELECTs which uses this table function, since
SETOF RECORD requires you to specify a column list. Maybe you can build
something like that using a table's implicit type.


Thanks,

Bernd