Question sur les vues sous PostgreSQL

8 réponses
Avatar
Etienne
Salut

Je crée une vue toute bête disons
CREATE VIEW ma_vue AS SELECT * FORM ma_table;

Pourquoi est-ce que cette vue est transformée en
CREATE VIEW ma_vue AS select ma_table.col1, ma_table.col2, ... FROM
ma_table;

En gros, y a t_il un moyen pour que ma vue reste
SELECT *
et pas SELECT de tous les champs
au moment où elle a été crée?

Merci
Etienne

8 réponses

Avatar
JKB
Le 07-06-2010, ? propos de
Question sur les vues sous PostgreSQL,
Etienne ?crivait dans fr.comp.applications.sgbd :
Salut



've

Je crée une vue toute bête disons
CREATE VIEW ma_vue AS SELECT * FORM ma_table;

Pourquoi est-ce que cette vue est transformée en
CREATE VIEW ma_vue AS select ma_table.col1, ma_table.col2, ... FROM
ma_table;

En gros, y a t_il un moyen pour que ma vue reste
SELECT *
et pas SELECT de tous les champs
au moment où elle a été crée?



En gros aussi, quel est le problème ?

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Avatar
Eric Masson
JKB writes:

'Lut,

En gros aussi, quel est le problème ?



Lorsque tu fais un alter table sur la table originelle pour ajouter un
champ, tu es obligé de récréer la vue pour prendre le nouveau champ en
compte, je ne sais pas si c'est un problème, mais il y a une étape de
plus.

--
Subject: écrivez moi vite , besoin d'explication
je vient d'acquérir cette chose formidable que l'on appelle Internet ,
je recherche quelqu'un pouvant m'expliquer comment faire
-+- VJ in GNU : Et t'as essayé la vaiselle avec les pieds ? -+-
Avatar
JKB
Le 07-06-2010, ? propos de
Re: Question sur les vues sous PostgreSQL,
Eric Masson ?crivait dans fr.comp.applications.sgbd :
JKB writes:

'Lut,

En gros aussi, quel est le problème ?



Lorsque tu fais un alter table sur la table originelle pour ajouter un
champ, tu es obligé de récréer la vue pour prendre le nouveau champ en
compte, je ne sais pas si c'est un problème, mais il y a une étape de
plus.



C'est bien ce que j'avais compris dans la question initiale. Je ne
vois pas vraiment comment faire autrement puisque le '*' doit être
traité dans l'interprète de ligne...

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Avatar
Etienne
Le 07/06/2010 14:44, JKB a écrit :
C'est bien ce que j'avais compris dans la question initiale. Je ne
vois pas vraiment comment faire autrement puisque le '*' doit être
traité dans l'interprète de ligne...



il est bien possible qu'il 'ya ai pas de solution.
en fait mon problème vient du fait que j'ai un script qui synchronise
deux schéma de base de données.

par convention, j'ai considéré que les champs commençant par _ était des
variables de test (sur le serveur de test).
et donc je ne les synchronize pas.
ca marche très bien, sauf que j'ai une vue sur ma base de dev qui
converti mon CREATE VIEIW AS SELECT *.

Bon c'est pas très grave, je vais améliorer le script pour regénérer la
vue en fonction des attributs qui la compose.
C'est jsute que s'il y avait eu un moyen...

Etienne.
Avatar
Sebastien Lardiere
Le 07/06/2010 14:08, Etienne a écrit :
Salut

Je crée une vue toute bête disons
CREATE VIEW ma_vue AS SELECT * FORM ma_table;

Pourquoi est-ce que cette vue est transformée en
CREATE VIEW ma_vue AS select ma_table.col1, ma_table.col2, ... FROM
ma_table;

En gros, y a t_il un moyen pour que ma vue reste
SELECT *
et pas SELECT de tous les champs
au moment où elle a été crée?



Non, ça n'est pas possible, la requête est réécrite lors du create view.

Une vue est une relation, on doit connaître la liste des colonnes et les
types de chacune de ces colonnes.

En fait, je ne vois pas de bonne raison de laisser un select * dans une
vue. Au même titre que je considère comme une mauvaise pratique le fait
de mettre un select * dans le code source d'une application -> toujours
spécifier ce qu'on cherche !

--
Sébsatien
Avatar
Etienne
Le 07/06/2010 16:23, Sebastien Lardiere a écrit :
En fait, je ne vois pas de bonne raison de laisser un select * dans une
vue. Au même titre que je considère comme une mauvaise pratique le fait
de mettre un select * dans le code source d'une application -> toujours
spécifier ce qu'on cherche !



En fait c'est surtout une question de facilité !!!
Mais bon dans mon cas présent effectivement j'aurai solutionné mon
problème si j'avais écrit les vues à la main.

Etienne
Avatar
SQLpro
Le SELECT * a été un long débat dans la norme SQL et ce qui est
ressortit de le discussion était qu'il ne devait pas être utilisé en
production, mais uniquement pour la mise au point du code (test de
requêtes).
PostGreSQL applique à juste titre la norme au pied de la lettre et tant
mieux !
Une vue dont la définition serait fluctuante ne peut avoir que des
inconvénient, notamment en matière de performances (recompilation et
perte des plans mis en cache si table modifiée...).

A +

Etienne a écrit :
Salut

Je crée une vue toute bête disons
CREATE VIEW ma_vue AS SELECT * FORM ma_table;

Pourquoi est-ce que cette vue est transformée en
CREATE VIEW ma_vue AS select ma_table.col1, ma_table.col2, ... FROM
ma_table;

En gros, y a t_il un moyen pour que ma vue reste
SELECT *
et pas SELECT de tous les champs
au moment où elle a été crée?

Merci
Etienne




--
Frédéric BROUARD - expert SGBDR et SQL - MVP SQL Server - 06 11 86 40 66
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Enseignant Arts & Métiers PACA, ISEN Toulon et CESI/EXIA Aix en Provence
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************
Avatar
SQLpro
Et pour compléter ma propre réponse, si vous avez des colonnes de même
nom résultant d'une jointure naturelle sur le lien d'association, la vue
serait susceptible de ne plus fonctionner, car comme toute table (et une
vue est une table d'un type particulier) il faut qu'il y ait unicité des
noms des colonnes dans la vue.

A +

SQLpro a écrit :
Le SELECT * a été un long débat dans la norme SQL et ce qui est
ressortit de le discussion était qu'il ne devait pas être utilisé en
production, mais uniquement pour la mise au point du code (test de
requêtes).
PostGreSQL applique à juste titre la norme au pied de la lettre et tant
mieux !
Une vue dont la définition serait fluctuante ne peut avoir que des
inconvénient, notamment en matière de performances (recompilation et
perte des plans mis en cache si table modifiée...).

A +

Etienne a écrit :
Salut

Je crée une vue toute bête disons
CREATE VIEW ma_vue AS SELECT * FORM ma_table;

Pourquoi est-ce que cette vue est transformée en
CREATE VIEW ma_vue AS select ma_table.col1, ma_table.col2, ... FROM
ma_table;

En gros, y a t_il un moyen pour que ma vue reste
SELECT *
et pas SELECT de tous les champs
au moment où elle a été crée?

Merci
Etienne








--
Frédéric BROUARD - expert SGBDR et SQL - MVP SQL Server - 06 11 86 40 66
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Enseignant Arts & Métiers PACA, ISEN Toulon et CESI/EXIA Aix en Provence
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************