Vous n'êtes pas identifié(e).
SQLpro a écrit :En sus, PG n'offre pas non plus de déclencheurs DDL (se lançant sur un ordre CREATE ALTER ou DROP) contrairement à Oracle ou SQL Server, ce qui aurait permis d'attribuer ces privilèges au moment de la création des objets !
ha ben je suis en retard d'une version !!!
A +
Ok, Merci pour vos réponses.
SQLPro, j'avais déjà créé le groupe est lui avait attribué toutes les permissions au schéma dans lequel nous travaillons. Le soucis principal, c'est que nous créons parfois jusqu'à une vingtaine de tables dans la journée, et je voulais savoir s'il y avait un moyen que tous les utilisateurs agissent au nom du groupe. C'est-à-dire, que lorsque qqn créé une table, cette table appartient au groupe directement plutot qu'à l'utilisateur qui l'a créée.
Hélas non, PstGreSQL n'offre aucune possibilité de ce côté là... contrairement à SQL Server par exemple qui permet de donner des privilèges au niveau des "conteneurs", comme la base (SQL Server est multibase) ou le schéma, donc avec héritage automatique pour les utilisateurs privilègies, ce qui règle une fois pour toute et pour l'avenir, donc la durée de vie de la base, toutes les problématiques d'attribution des privilèges.
En sus, PG n'offre pas non plus de déclencheurs DDL (se lançant sur un ordre CREATE ALTER ou DROP) contrairement à Oracle ou SQL Server, ce qui aurait permis d'attribuer ces privilèges au moment de la création des objets !
A +
Commençons par la sémantique... Il faut vous débarrasser du mot DROIT qui n'a pas sa place dans les SGBDR relationnel. La notion de "droit" est purement système.. Droit de lire, d'écrire... Or dans un SGBDR le seul qui a le droit de lire ou d'écrire est le moteur relationnel ! Tout ce que les utilisateurs peuvent faire c'est envoyer des requête SQL (qui sont des demandes) en espérant qu'elles produisent leur effet sur les objets manipulés.
Donc un PRIVILÈGE est la permission d'utiliser une COMMANDE SQL particulière sur un OBJET précis (vue, table, routines...).
Dans une base de données on est confronté à un problème d’œuf et de poule... Pour créer une base il faut un utilisateur SQL qui sera le propriétaire des objets et aura le droit de vie ou de mort et sur ces objets et possède tous les privilèges dessus implicitement. Cet utilisateur ne pourra en aucun cas être supprimé, sinon vous ne pourriez plus, ni modifier, ni supprimer les objets existants, ni même (et bien entendu) transmettre les privilèges sur ces objets.
Ensuite, sachez que la délivrance des privilèges est chainée. Ainsi le propriétaire peut donner tous les privilèges qu'il souhaite, et s'ils les donnent avec la possibilité de rétrocession (WITH GRANT OPTION), alors celui qui a acquis les privilèges peut à son tour les transmettre. Ainsi USER_A donne par GRANT des privilèges à USER_B et si WITH GRANT OPTION, alors USER_B peut faire un GRANT à USER_C des privilèges acquis...
De plus les privilèges sont cumulatifs. C'est à dire qu'un privilège donné 3 fois par 3 utilisateurs nécessite 3 REVOKE pour que l'utilisateur final n'ait plus la possibilité d'agir.
Exemple, soit USER_A, USER_B et USER_C. Si USER_A et USER_B possèdent tous les privilèges sur tous les objets et que les commandes suivantes sont passées :
USER_A lance la commande : GRANT SELECT ON Table1 TO USER_C;
USER_B lance la commande : GRANT SELECT ON Table1 TO USER_C;
alors si USER_A récuse la commande transmise par :
USER_A lance la commande : REVOKE SELECT ON Table1 TO USER_C;
alors USER_C peut toujours faire un SELECT sur la Table1, parce qu'il a acquis de USER_B !
Pour savoir ou vous en êtes des privilèges, il faut lire les métadonnées avec les vues : INFORMATION_SCHEMA.TABLES_PRIVILEGES et INFORMATION_SCHEMA.COLUMN_PRIVILEGES.
Pour que vos utilisateurs puissent faire tout ce que vous voulez, il faut explicitement donner les privilèges adéquats sur chaque objet à chacun des utrilisateurs (si n objet et m utilisateurs, il faudra n x m GRANT !).
IMPORTANT : le GRANT ALL est supprimé dans la norme SQL ce qui signifie qu'un jour il risque de disparaître des commandes PG...
Pas de panique... le plus simple est de passer par un rôle.
1) création d'un rôle :
CREATE ROLE ROL_FAITOUT;
2) attribuer des privilèges à ce rôle :
GRANT INSERT, UPDATE, DELETE, SELECT ON TABLE_1 TO ROL_FAITOUT;
...
3) donner à vos utilisateurs, le rôle ROL_FAITOUT :
GRANT ROL_FAITOUT TO USR_1;
Vos utilisateurs peuvent maintenant faire toute ce que le rôle ROL_FAITOUT leur permet de faire.
Il est important au final de dissocier les rôles permettant des ALTER / CREATE / DROP (propriétaires des objets) et les rôles de production qui permet d'utiliser les objets de la base.
À NOTER : tout ceci fait partie de la norme SQL et est expliqué dans mon livre : "SQL, 4e édition, Colection Synthex, Pearson Educ.
Mon site web en donne un extrait : La gestion des privilèges La notion de rôle ayant été rajoutée avec la version 1999 de la norme SQL.
A +
Hou quelle horreur ! Faites plutôt une seule requête et une seule ligne commençant par :
RETURN CASE WHEN EXISTS(ma requête test) THEN true ELSE false END;
A +
Voici les droits associés à ce compte de service :
output
-------------------------------------------------------------------------------------------------
autorite nt\service réseau
Nom de privilège Description État
============================= ========================================================= =========
SeAssignPrimaryTokenPrivilege Remplacer un jeton de niveau processus Désactivé
SeIncreaseQuotaPrivilege Ajuster les quotas de mémoire pour un processus Désactivé
SeShutdownPrivilege Arrêter le système Désactivé
SeAuditPrivilege Générer des audits de sécurité Désactivé
SeChangeNotifyPrivilege Contourner la vérification de parcours Activé
SeUndockPrivilege Retirer l'ordinateur de la station d'accueil Désactivé
SeImpersonatePrivilege Emprunter l'identité d'un client après l'authentification Activé
SeCreateGlobalPrivilege Créer des objets globaux Activé
SeIncreaseWorkingSetPrivilege Augmenter une plage de travail de processus Désactivé
SeTimeZonePrivilege Changer le fuseau horaire Désactivé
Ceci dit, il n'est pas recommandé d'utiliser ce compte de service pour des raison de sécurité, mais d'en créer un spécifique au service PG avec les permissions qui vont bien, et si possible sous le contrôle de l'AD...
A +
C'est normal : vous ne verrez que l'activité courante, c'est à dire le fetch.
Le texte de la requête doit être considérée comme le contenu d'une variable, même si c'est un peu plus complexe que ça. Or PG ne dispose pas d'un débugeur permettant de "voir" le contenu des variables, et ne fournit pas non plus d'outil pour aller capturer en mémoire le contenu d'une entrée du cache, comme c'est le cas danc SQL Server ou Oracle...
A +
Je cherche à insérer toutes les données d'une précédente base de données sur une base vierge. Mon script se compose seulement de ligne "Insert into ...". Or l'une des tables possède un trigger
Votre déclencheur ayant déjà sans doute été joué dans la précédente version de votre base (la base source), il est inutile et dangereux de le redéclencher. Dans ce cas de figure il est nécessaire de désactiver tous les déclencheurs.
A +
En fait pour avoir travailler sur ce sujet il y a longtemps, pour une base historique, nous avions procédé comme suit :
1) une colonne "DATE_LITTERALE" VARCHAR(100) --> exemple : 13 brumaire de l'an II, 15 jours après la tempête de juin 1512...
2) une colonne "DATE_AN" SMALLINT (de 1 à 2014)
3) une colonne "DATE_MOIS" SMALLINT (de 1 à 12)
4) une colonne "DATE_JOUR" SMALLINT (de 1 à 31)
--> ces 3 dernières pour des dates partiellement connues, donc avec des NULL vectorisés : (DATE_AN NOT NULL AND DATE_MOIS NULL AND DATE_JOUR NULL) OR (DATE_AN NOT NULL AND DATE_MOIS NOT NULL AND DATE_JOUR NULL) OR (DATE_AN NOT NULL AND DATE_MOIS NOT NULL AND DATE_JOUR NOT NULL)
5) une colonne "DATE_GREGORIEN" NULLable (dates "actuelles) --> début si intervalle de temps
6) une colonne "DATE_GREGORIEN_MAX" NULLable (dates "actuelles) --> fin si intervalle de temps
7) une colonne "GEO_LOCALISATION" VARCHAR(250) données du lieu en littéral.
A +
ATTENTION : au sujet des calendrier pour la gestion des données historique il est nécessaire de maintenir une base de calendrier et non pas un seul calendrier. En effet si le cas du calendrier républicain est simple (un date ISO = une date républicaine) il n'en est pas de même dans le temps et dans l'espace... En effet, en 1582 a eu lieu la réforme du calendrier julien vers le calendrier grégorien et les dates ont divergées dans les différentes pays...
Extrait de mon ouvrage "SQL", 4e édition, collection Synthex, Pearson Education 2012 :
"
Réforme du calendrier julien :
Au cours de l’Histoire et compte tenu de la précision accrue des calculs astronomiques, on constate que le calendrier julien souffre d’un manque de précision : la durée de l’année julienne est trop longue d’un peu plus de 11 minutes (365,25 jours au lieu de 365,2422) et, au fil du temps, le calendrier finit par retarder de plusieurs jours. C’est le pape Grégoire XIII qui entreprend de réformer le calendrier. Pour cela, 10 jours furent supprimés de l’année 1582, où le 4 octobre fut immédiatement suivi par le 15 octobre. Pour éviter de nouvelles dérives, la surévaluation de l’année julienne fut corrigée par la suppression de 3 jours tous les 400 ans. On ignore donc la règle des années bissextiles les années séculaires, sauf pour celles qui sont divisibles par 400.
On a donc 97 années bissextiles par période de 400 ans et la durée moyenne d’une année grégorienne est 365 + 97/100, c’est-à-dire 365,2425 jours.
Cette réforme nécessaire n’a pas été adoptée à la même date dans tous les pays, par exemple :
• L’Italie, l’Espagne, le Portugal et la Pologne sont passés du 4 octobre 1582 au 15 octobre 1582.
• La France (sauf l’Alsace et la Lorraine) est passée du 9 décembre 1582 au 20 décembre 1582.
• Le Luxembourg est passé du 14 décembre 1582 au 25 décembre 1582.
• La Belgique (alors province des Pays-Bas) est passée du 21 décembre 1582 au 1er janvier 1583.
• Le Valais Suisse est passé du 28 février 1655 au 11 mars 1655.
• L’Alsace est passée du 4 février 1682 au 16 février 1682.
• Zurich, Berne, Bâle et Genève sont passés du 31 décembre 1700 au 12 janvier 1701.
• L’Angleterre est passée du 2 septembre 1752 au 14 septembre 1752.
• La Lorraine est passée du 16 février 1760 au 28 février 1760.
• L’URSS est passée du 31 janvier 1917 au 14 février 1917.
"
FIN DE CITATION
ATTENTION (bis) : certaines régions sont passées alternativement d'u pays à l'autre du fait des guerres. Il n'est donc pas rare dans certains village d'avoir des date rétrograde en continuité de l'état civil (les trous sont moins visibles...)
A +
Les séquences ne sont en fait qu'un nom et une valeur dans une table système interne de PG. Ce ne sont pas des tables et ils n'ont pas de lien génétique avec le stockage de la table.
A +
Bonjour,
Oui, effectivement, les données de plusieurs lignes peuvent être regroupées (ou pas) dans des mêmes blocs ou pages.
Que vous inspire la valeur de 200 ko/s ? Est-elle si mauvaise que cela pour PostgreSQL dans une architecture physique correcte ?
Difficile de vous repondre car cela dépend de la méthode de calcul...
Le calcul pour obtenir le débit en volume de 200 ko/s a été fait par une règle de trois (règle de proportionnalité) en partant du nombre de lignes ramenées.
C'est un calcul théorique qui ne prend pas en compte la réalité du nombre de pages ramenées.
C'est bien cela le hic. Le seul moyen de prouver la chose est de faire un test sur une base maquette avec une table préremplie dont vous connaissez très exactement le nombre de pages et de lignes concernées.
Si chaque (ou pratiquement chaque) ligne ramenée est dans une page différente (ce qui me semble loin d'être impossible en fonction du type d'alimentation), l'accès d'une ligne (c'est à dire l'accès d'une page de 8 ko) en moins de 1 ms (une milliseconde) est-il un signe d'accès disque lent ?
Cela dépend beaucoup de la nature de vos disque (SAS, SATA... - 7 500, 10 000, 15 000 rpm... SSD) votre organisation de disques (RAID 1, 5, 10...).
Y-a-t-il un moyen de savoir combien de pages sont réellement chargées (ou impactées) au cours d'une requête particulière ?
Ce n'est pas aussi simple que sous SQL Server ou vous avez SET STATISTICS IO ON qui permet de tracer toutes les IO de toutes les tables. mais vous pouvez utiliser une combinaison de
EXPLAIN (ANALYZE ON, BUFFERS ON) MaRequête... avec les vue systèmes pg_statio_* (http://www.postgresql.org/docs/current/ … stats.html)
Pour choisir le plan d'exécution réelle de la requête SQL, l'optimiseur ou planificateur PostgreSQL prend-il en compte le nombre réel de pages qu'il devra charger ?
Non, il estime le nombre de lignes en fonction des statistiques, mais à partir du moment ou vous avez les bons index - les statistiques n'étant disponible que sous les indes. Sinon, il n'y a pas comme sous SQL Server de statistiques de colonnes de tables.
Cependant vous pouvez tenter d'augmenter le nombre d'intervalle dans l'histogramme statistiques qui par défaut est un peu faible dans PG (default_statistics_target / ALTER TABLE SET STATISTICS).
A +
Bonjour,
Pour ma part, je ne pense pas qu'il y ait de problème d'accès disques puisque le phénomène se ou s'est produit sur deux machines distinctes (celle en 8.4.2 et celle en 9.2.4).
Par ailleurs, ce sont des machines qui abritent d'autres instances PostgreSQL et je n'ai pas eu connaissance de problème de lenteur d'accès disque.
Je vais toutefois essayer de me renseigner.Par ailleurs, je ne retrouve pas votre débit de 20 ko/s (mais plutôt 200 sauf erreur de ma part) :
30 Go pour 200 millions de lignes environ, soit environ 150 octets par ligne
pour 20.000 lignes, on a : 3 Mo
et 3 Mo en 13 ou 16s donne environ 200 ko/sMais, je pense qu'il faut davantage raisonner en nombre de lignes qu'en volume :
l'accès d'une ligne se faisant en moins de 1 ms (une milliseconde), ce qui ne me semble pas complètement mauvais.
Les SGBDR ne travaillent pas en ligne mais en page pour les lectures et écritures physiques. Et dans PG les pages font toujours 8 Ko...
A +
De plus la norme SQL c'est 128 caractères maximum pour la taille des noms des objets et sachez que Oracle dans sa future version a entrepris enfin de se conformer à la norme en acceptant des noms longs pour tous ses objets c'est à dire jusqu'à 128 caractères...
A +
Bonjour,
postgres n'a pas de notion de base hors ligne, et c'est en général quelque chose d'inutile. ...
L'intérêt du hors ligne et aussi de faire dégager du cache immédiatement tous les objets de la base mise offline et donc d'apporter du souffle à la mémoire pour les autres bases. Dire que c'est inutile est idiot !
PG ne sait effectivement pas découpler la base du serveur et vider le cache d'une base dont on aura empêché les utilisateurs de se connecter,...
A +
Bonjour,
Je ne connais pas en détail toutes les possibilités offerte en matière de haute disponibilité, mais les solutions que propose pg_pool par exemple pourrait correspondre à ce que je cherche. Par exemple si on a deux clusters gérés par pg_pool, on peut imaginer que l'on peut passer du ddl sur un cluster puis ensuite sur l'autre (du coup sans interruption de service) ? Je me trompe ?
Sinon je me demande comment font les autres entreprises qui font du 24/7 pour faire évoluer leur modèle de données (je pense en particulier au site leboncoin qui est sous postgresql).Cordialement.
Le bon coin est indisponible la nuit justement pour assurer ces traitements là (reindexation, vacuum, DDL...)
Seule la lecture est possible, mais pas l'joute de nouvelles annonces. C'est son point faible.
Effectivement Oracle ou SQL Server permettent de faire du DDL et de la réindexation non bloquante sur des bases en prod 24/24 7/7.
A +
Il faut distinguer le créateur du producteur : le créateur crée la base, le producteur produit les données. Le reste est l'affaire des utilisateurs.
A +
Quant est-il du chiffrement de la base de données même? Par exemple, la table des utilisateurs et des mots de passe?
Tout ce que j'ai par rapport au chiffrement (http://docs.postgresql.fr/9.0/encryption-options.html) mentionne seulement md5.
Est-il possible d'utiliser une autre fonction de hachage cryptographique plus sécuritaire tel que SHA-256?
Effectivement c'est un des points faible de PG... Les mots de passe des connexions ne sont pas cryptés... Les algorithmes de hachage n'ayant rien à voir avec du cryptage !
Dans un audit pour une base de données de santé accessible en ligne nous avons soulevé ce point qui est incompatible avec les directives nationales sur le cryptage des données de santé.
Pire, pgcrypto ne permet pas de gérer les clefs de cryptage de manière externe (par boitier HSM par exemple) ce qui induit fatalement de les conserver en local, et comme les comptes de connexion sont des passoires...
A +
Bonjour,
Un de nos client dispose d'une licence d'utilisation d'un logiciel propriétaire dont les données sont stockées sur une base postgresql. Il est propriétaire des données, mais d'après l'éditeur la base de données appartient à l'éditeur.
Non, juridiquement, la base appartient bien à celui qui possède et utilise les données. L'éditeur ne détient que la propriété intellectuelle du modèle de données. (ceci remonte d'ailleurs bien avant l’invention des bases de données informatique, via la jurisprudence Didot Bottin et à été traduit en droit européen - cf directive 96/9/CE du 11 mars 1996 sur la protection des bases de données, traduite en Loi n°98-536 du 1er juillet 1998 : JO 2 juillet 1998, p. 10075)
Ce client nous avait mandaté il y a plus d'un an pour développer un programme permettant d'exporter une partie des données vers des fichiers CSV de manière périodique pour alimenter son site web (que nous avons conçu).
Après avoir prévenu l'éditeur (il y a plus d'un an), l'éditeur et notre société ont fait parvenir un devis au client qui a finalement choisi notre devis. Après avoir mené le projet à terme et fait plusieurs réunions avec le client, nous avons mis le programme en production il y a quelques mois et le client est maintenant propriétaire de ce programme d'export.
Le logiciel et la base sont hébergés sur le serveur du client, le client nous a donné l'accès au serveur et nous avons donc pu accéder à la base de données car le concepteur avait conservé le mot de passe par défaut du user postgres.
Or depuis quelques jours, le développeur du logiciel a coupé notre accès à distance, changé le mot de passe postgres, sans prévenir le client, coupant ainsi l'accès du programme et à la mise à jour du site, et nous a envoyé une lettre pleine de politesses en nous rappelant que lui seul est propriétaire de la base de données, tout en rappelant que le client est propriétaire des données (sic) mais qu'il nous interdit d'y accéder, il nous tient pour seuls responsables de ce qu'il qualifie d'un "piratage".
Imaginez la transposition à une location de voiture : on vous loue la voiture, vous pouvez la conduire, mais on vous clos le pot d'échappement ou on soude le bouchon du réservoir d'essence...
Cela n'a jamais tenu la route en droit, car sinon, cela vous empêcherait de faire :
- des sauvegardes et des restaurations
- des imports et des exports
- d'ajouter des index ou de les maintenir
- de déplacer les espaces de stockage
....
Nous ne nous sentons pas vraiment responsables car nous pensons avoir informé suffisamment le client et l'éditeur et n'avons agit que sur demande du client, de plus le client est de notre côté et nous pensons que c'est à notre client de régler la situation. Néanmoins nous aimerions le conseiller pour qu'il puisse rétablir la situation dans les meilleurs conditions car son site du coup n'est plus alimenté :
1. L'éditeur est-il dans son droit ?
Non, et comme il ne peut faire justice lui même, il est doublement en tort.
1 - pour ne pas avoir respecter le droit
2 - pour avoir fait justice lui-même en coupant d'autorité un accès préalablement ouvert afin de vou punir (et par le même punir son client)
2. Quel(s) recours notre client a t-il ?
La justice... Mais mieux vaut commencer par une lettre ferme venant par exemple d'un expert judiciaire, voire l'expédier par voie d'huissier...
3. N'existe t-il pas une sorte de "droit d'accès aux données" qu'il pourrait faire valoir ? Ce droit est-il applicable à l'accès à la base Postgresql ou juste au logiciel ?
C'est un peu plus compliqué que cela, mais l'esprit est là... En effet, dès que le droit est silencieux, alors ce sont les règles de l'art qui s'appliquent.
4. Sommes-nous responsables ?
À priori non, mais tout dépend du contrat qui vous lie avec ce client... En revanche, vous aviez une obligation de conseil. Au pire des cas, si le client vous attaque, vous devez envisager une action oblique... c'est à dire vous retourner contre l'éditeur à votre tour. Donc, il n'a pas intérêt à le faire. Petit conseil : vous et votre client, devriez rechercher la solution de concert à cet imbroglio (pour moi il y a une mauvaise foi manifeste, et le juge pourrait aprécier très modérément ce "boudage" )
Pour l'instant, nous lui avons juste conseillé de décortiquer sa licence pour voir s'il dispose des droits d'exploiter les données et s'il y a des restrictions et d'essayer de négocier à l'amiable avec l'éditeur.
La licence en est une, le droit en est une autre. Généralement les éditeurs étant ignare en matière juridique et faisant rarement appel aux avocats spécialisés, on trouve des clauses léonines en pagaille et souvent de nombreuses clauses illicites. Il faut donc faire une étude de la licence et du droit actuel...
Merci de votre réponse.
A +
Vos méthodes beginTransaction(), SaveToDB() et commit() / rollback() partagent-elle la même connexion et celle-ci reste t-elle ouverte entre les différentes commandes ?
A +
J'ai eu pas mal de problèmes similaires avec les versions récentes de PG depuis la 9... sous Windows (en 64 bits)
J'ai même été obligé de formater mon disque de portable.
A priori il y a quelques chose de pas stable entre PG ou l'agent PG, peut être au niveau des ports....
Mais je n'ai rien trouvé, car les crash pg ne génèrent pas à priori de dump..
A +
PostGreSQL n'utilise pas plus d'un CPU/Coeur par requête. Dès lors les requêtes s'exécutent en parallèle pour des connexions différentes. Donc, rien à faire !!!
A +
Dans votre CMD vous devez placer des verbes dans vos associations.... a, b, c, d, e, f ne veut rien dire.
Un MCD montre la sémantique d'articulation des entités informationnelles entres elles; Sans verbe, aucun intérêt !
1) si des entités portent les mêmes noms à un détail près (ici N allant de 1 à 6) et les mêmes colonnes, alors il y a certainement un défaut de conception
2) si en outre, la sémantique et la cardinalité des associations envers ces mêmes entités similaires, alors il y a un autre défaut de conception.
En tout état de cause vous n'avez effectivement besoij que d'une seule entité de nom geo, comportant en sus une colonne "geo_n" dont le domaine irait de 1 à 5 et est à rajouter à la clef de votre entité comportant déjà la colonne geo_gid.
Voter seule association entre geo et opération_reseau gardant la même, cardinalité.
Et rien ne vous empêche de rajouter à votre base les vues geo1, geo2, geo3 construite sur le modèle suivant :
CREATE VIEW V_geo_1
AS
SELECT geo_gid, geo_matricule, geo_longueur, ope_id
FROM geo
WHERE geo_n = 1
Lisez UML pour SQL aux éditions Eyrolles, un ouvrage consacré à la modélisation des bases de données co écrit par mon collègue Christian Soutou et moi même...
A +
Effectivement problème e conception gravissime ce qui se traduit par :
1) difficulté d'écrire des requêtes. D'où votre post...
2) performances dégradées...
Revoyez votre modèle pour un vrai MCD conforme à la normalisation et vous verrez que vous n'aurez plus de question à vous poser sur l'écriture des requêtes !
A +
Bonjour à tous,
Voilà je voudrais savoir, mais je pense que ce que je vais dire peut être considéré comme stupide, s'il était possible dans une clause WHERE de stipuler qu'un champ devait être égal à sa valeur par défaut? Dans mes rêves les plus fous cela donnerait quelque chose comme:
SELECT * FROM machin WHERE champ = DEFAULT;
ou encore
SELECT * FROM machin WHERE champ IS DEFAULT;
...
Est-ce possible?
Vos rêves ne sont pas fous, mais c'est un petit peu plus compliqués :
La vue de métadonnées INFORMATION_SCHEMA.COLUMNS contient la valeur par défaut de toute colonne de toute table. Dès lors vous pouvez faire :
SELECT * FROM machin WHERE champ =
(SELECT COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'public'
AND TABLE_NAME = 'machin'
AND COLUMN_NAME = 'champ');
A +
Dans l'article cité, voici le requête :
SELECT DISTINCT T.oid AS table_space_oid,
spcname AS table_space_name,
CASE spcname
WHEN 'pg_default'
THEN setting || '/base/' || CAST(D.oid
AS VARCHAR(16))
WHEN 'pg_global'
THEN setting || '/global/'
ELSE spclocation
END AS location
FROM pg_tablespace AS T
CROSS JOIN pg_settings AS S
CROSS JOIN pg_database AS D
WHERE S.name = 'data_directory'
AND spcname <> 'pg_global'
AND D.datname = current_database();
A +