IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Ajouter un type de données par fonctions


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2009
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 131
    Par défaut Ajouter un type de données par fonctions
    Boinjour,

    Dans la continuité de mon précédent message (copier des tables entre 2 serveurs), il s'avère que je suis confronté à un autre souci.
    Et cela dépasse il faut bien le dire mes compétences !!!!

    Descriptif du contexte :
    2 bases Postgres sur deux serveurs distincts

    Dans le serveur source (là ou je dispose de toutes les tables), j'ai des champs avec un type de données = geometry, type de donnée reconnu par la base en cours.
    Je crois comprendre que ce type est reconnu car il existe dans ma base un ensemble de fonctions qui font que celui-ci est reconnu.
    En voici un extrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    -- Function: addgeometrycolumn(character varying, character varying, character varying, character varying, integer, character varying, integer)
     
    -- DROP FUNCTION addgeometrycolumn(character varying, character varying, character varying, character varying, integer, character varying, integer);
     
    CREATE OR REPLACE FUNCTION addgeometrycolumn(character varying, character varying, character varying, character varying, integer, character varying, integer)
      RETURNS text AS
    '
    DECLARE
    	catalog_name alias for $1;
    	schema_name alias for $2;
    	table_name alias for $3;
    	column_name alias for $4;
    	new_srid alias for $5;
    	new_type alias for $6;
    	new_dim alias for $7;
    	rec RECORD;
    	schema_ok bool;
    	real_schema name;
     
    BEGIN
     
    	IF ( not ( (new_type =''GEOMETRY'') or
    		   (new_type =''GEOMETRYCOLLECTION'') or
    		   (new_type =''POINT'') or 
    		   (new_type =''MULTIPOINT'') or
    		   (new_type =''POLYGON'') or
    		   (new_type =''MULTIPOLYGON'') or
    		   (new_type =''LINESTRING'') or
    		   (new_type =''MULTILINESTRING'') or
    		   (new_type =''GEOMETRYCOLLECTIONM'') or
    		   (new_type =''POINTM'') or 
    		   (new_type =''MULTIPOINTM'') or
    		   (new_type =''POLYGONM'') or
    		   (new_type =''MULTIPOLYGONM'') or
    		   (new_type =''LINESTRINGM'') or
    		   (new_type =''MULTILINESTRINGM'')) )
    	THEN
    		RAISE EXCEPTION ''Invalid type name - valid ones are: 
    			GEOMETRY, GEOMETRYCOLLECTION, POINT, 
    			MULTIPOINT, POLYGON, MULTIPOLYGON, 
    			LINESTRING, MULTILINESTRING,
    			GEOMETRYCOLLECTIONM, POINTM, 
    			MULTIPOINTM, POLYGONM, MULTIPOLYGONM, 
    			LINESTRINGM, or MULTILINESTRINGM '';
    		return ''fail'';
    	END IF;
     
    	IF ( (new_dim >4) or (new_dim <0) ) THEN
    		RAISE EXCEPTION ''invalid dimension'';
    		return ''fail'';
    	END IF;
     
    	IF ( (new_type LIKE ''%M'') and (new_dim!=3) ) THEN
     
    		RAISE EXCEPTION ''TypeM needs 3 dimensions'';
    		return ''fail'';
    	END IF;
     
    	IF ( schema_name != '''' ) THEN
    		schema_ok = ''f'';
    		FOR rec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP
    			schema_ok := ''t'';
    		END LOOP;
     
    		if ( schema_ok <> ''t'' ) THEN
    			RAISE NOTICE ''Invalid schema name - using current_schema()'';
    			SELECT current_schema() into real_schema;
    		ELSE
    			real_schema = schema_name;
    		END IF;
     
    	ELSE
    		SELECT current_schema() into real_schema;
    	END IF;
     
     
    	-- Add geometry column
     
    	EXECUTE ''ALTER TABLE '' ||
    		quote_ident(real_schema) || ''.'' || quote_ident(table_name)
    		|| '' ADD COLUMN '' || quote_ident(column_name) || 
    		'' geometry '';
     
     
    	-- Delete stale record in geometry_column (if any)
     
    	EXECUTE ''DELETE FROM geometry_columns WHERE
    		f_table_catalog = '' || quote_literal('''') || 
    		'' AND f_table_schema = '' ||
    		quote_literal(real_schema) || 
    		'' AND f_table_name = '' || quote_literal(table_name) ||
    		'' AND f_geometry_column = '' || quote_literal(column_name);
     
     
    	-- Add record in geometry_column 
     
    	EXECUTE ''INSERT INTO geometry_columns VALUES ('' ||
    		quote_literal('''') || '','' ||
    		quote_literal(real_schema) || '','' ||
    		quote_literal(table_name) || '','' ||
    		quote_literal(column_name) || '','' ||
    		new_dim || '','' || new_srid || '','' ||
    		quote_literal(new_type) || '')'';
     
    	-- Add table checks
     
    	EXECUTE ''ALTER TABLE '' || 
    		quote_ident(real_schema) || ''.'' || quote_ident(table_name)
    		|| '' ADD CONSTRAINT '' 
    		|| quote_ident(''enforce_srid_'' || column_name)
    		|| '' CHECK (SRID('' || quote_ident(column_name) ||
    		'') = '' || new_srid || '')'' ;
     
    	EXECUTE ''ALTER TABLE '' || 
    		quote_ident(real_schema) || ''.'' || quote_ident(table_name)
    		|| '' ADD CONSTRAINT ''
    		|| quote_ident(''enforce_dims_'' || column_name)
    		|| '' CHECK (ndims('' || quote_ident(column_name) ||
    		'') = '' || new_dim || '')'' ;
     
    	IF (not(new_type = ''GEOMETRY'')) THEN
    		EXECUTE ''ALTER TABLE '' || 
    		quote_ident(real_schema) || ''.'' || quote_ident(table_name)
    		|| '' ADD CONSTRAINT ''
    		|| quote_ident(''enforce_geotype_'' || column_name)
    		|| '' CHECK (geometrytype('' ||
    		quote_ident(column_name) || '')='' ||
    		quote_literal(new_type) || '' OR ('' ||
    		quote_ident(column_name) || '') is null)'';
    	END IF;
     
    	return 
    		real_schema || ''.'' || 
    		table_name || ''.'' || column_name ||
    		'' SRID:'' || new_srid ||
    		'' TYPE:'' || new_type || 
    		'' DIMS:'' || new_dim || chr(10) || '' ''; 
    END;
    '
      LANGUAGE 'plpgsql' VOLATILE STRICT;
    Quelqu'un peut-il me confirmer ou pas que ce script fait bien en sorte que ce type de données soit bien reconnu par la base en cours ?

    Si oui découle alors mon autre question :
    Comment faire dans mon serveur cible (là ou je ne dispose pas de toutes les tables) pour que ce type de données soit bien reconnu avec la fonction qui est bien présente aussi sur ce serveur ?

    Car il évidemment si je prends un script me permettant de créer une table dont un des champs est de ce type, cela ne fonctionne pas !!!!!

    Un peu d'aide sur la compréhension de ce souci serait la bienvenue

    En attendant, bonne journée à tous

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Je n'ai jamais manipulé ça personnellement mais il me semble que le type geometry implique que le serveur soit muni de l'extension Postgis. Il faudrait donc que le serveur cible en soit pourvu lui aussi.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre confirmé
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2009
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 131
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Je n'ai jamais manipulé ça personnellement mais il me semble que le type geometry implique que le serveur soit muni de l'extension Postgis. Il faudrait donc que le serveur cible en soit pourvu lui aussi.
    Merci de votre aide
    Je vais aller vérifier ce paramètre là, même si je ne sais pas encore comment faire !!!
    Bon après-midi

Discussions similaires

  1. [SP-2010] Modification de propiétés de type méta donnée par un SharePoint Workflow
    Par NicolasST dans le forum SharePoint
    Réponses: 2
    Dernier message: 05/06/2014, 12h48
  2. Transmission données par fonction mail()
    Par goofyto8 dans le forum Langage
    Réponses: 2
    Dernier message: 08/09/2013, 21h22
  3. Réponses: 2
    Dernier message: 08/10/2006, 11h44
  4. Forum en asp et ajout de données par visiteurs
    Par nawal59 dans le forum ASP
    Réponses: 2
    Dernier message: 10/05/2006, 00h02
  5. Réponses: 9
    Dernier message: 02/03/2005, 22h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo