PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 07/01/2012 22:46:16

Morby
Membre

Prb avec fonction current_date dans une règle

suite de mon mini-wiki sous postgres

table des utilisateurs :

DROP TABLE LGPUTILS CASCADE;
CREATE TABLE LGPUTILS
       (NUMUSER SERIAL,
        NOM VARCHAR(25) PRIMARY KEY,
    PASSWORD VARCHAR(25) NOT NULL,
    NBARTICLECREE INTEGER DEFAULT '0'
    );

-- droits d'accès pour la séquence (SERIAL)
GRANT USAGE on lgputils_numuser_seq to public;

--création d'une vue qui permet de voir tous les attributs de la table
DROP VIEW LGPUSERNEW;
CREATE VIEW LGPUSERNEW AS SELECT * FROM LGPUTILS;

grant select on LGPUSERNEW to public;
grant insert on LGPUSERNEW to public;
grant update on LGPUSERNEW to public;

-- création d'une règle sur la vue "LGPUSERNEW"
-- permettant l'insertion de nouveaux utilisateurs avec automatisme : nom = compte utilisateur
DROP RULE usernew_insert on LGPUSERNEW CASCADE;
CREATE RULE usernew_insert AS ON INSERT TO LGPUSERNEW DO INSTEAD
    INSERT INTO LGPUTILS VALUES
    (default,
    current_user,
    NEW.PASSWORD);

table des sujets

DROP TABLE LGPSUJET CASCADE;
CREATE TABLE LGPSUJET
       (NUMSUJET SERIAL PRIMARY KEY,
    AUTEUR VARCHAR(25) REFERENCES LGPUTILS (NOM),
    TITRE VARCHAR NOT NULL,
    DATEPARUTION DATE DEFAULT current_date,
    DATEMODIF DATE DEFAULT current_date,
    AUTEURMODIF VARCHAR(25) REFERENCES LGPUTILS (NOM),
    NUMBACKUP INTEGER DEFAULT '1',
    NBVUE INTEGER DEFAULT '0',
    TEXTE VARCHAR NOT NULL,
    PROTECTION INTEGER DEFAULT '1'
    );

-- droits d'accès pour la séquence (SERIAL)
GRANT USAGE on lgpsujet_numsujet_seq to public;

-- création d'une vue qui permet de voir tous les sujets de la table
CREATE VIEW ALLSUJET AS SELECT * FROM LGPSUJET;

grant select on ALLSUJET to public;
grant insert on ALLSUJET to public;

l'idée est que lorsque un utilisateur créé un sujet l'insert se fait à travers une vue "ALLSUJET", la requete se présente sous cette forme :
INSERT INTO LGPSUJET (TITRE,TEXTE)
    VALUES  ('test-creation','texte muet');
- le n° de sujet est automatique avec la fonction "serial"
- le nom de l'auteur est automatique avec la fonction "current_user"
- les dates de parution et de modification prennent automatiquement la date du jour (DEFAULT current_date)

j'essaye donc de créer ma vue "ALLSUJET" :

DROP RULE sujet_insert ON ALLSUJET;
CREATE RULE sujet_insert AS ON INSERT TO ALLSUJET DO INSTEAD
    INSERT INTO LGPSUJET VALUES
    (default,
    current_user,
    NEW.TITRE,
    NEW.TEXTE);

et là, c'est le drame :

ERREUR:  la colonne « dateparution » est de type date mais l'expression est de type character varying
LIGNE 6 : NEW.TEXTE);
          ^
ASTUCE : Vous devez réécrire l'expression ou lui appliquer une transformation de type.

je ne comprend pas du tout l'erreur...

par acquis de conscience j'ai fait un test d'insert directement dans la table et ça fonctionne très bien :

INSERT INTO LGPSUJET (TITRE,TEXTE) VALUES  ('test-creation','texte muet');

select * from lgpsujet;
numsujet | auteur |     titre     | dateparution | datemodif  | auteurmodif | numbackup | nbvue |   texte    | protection
----------+--------+---------------+--------------+------------+-------------+-----------+-------+------------+------------
        1 |        | test-creation | 2012-01-07   | 2012-01-07 |             |         1 |     0 | texte muet |          1

galère galère... sad

Hors ligne

#2 08/01/2012 01:12:31

gleu
Administrateur

Re : Prb avec fonction current_date dans une règle

Vous n'indiquez pas dans la commande INSERT les colonnes que vous voulez utiliser pour l'insertion. Donc pour lui, default se refaire à la première colonne (numsujet), current_user à la deuxième (auteur), NEW.TITRE à la troisième (titre), NEW.TEXTE à la quatrième. Or la quatrième est dateparution, de type date, et NEW.TEXTE est de type varchar. D'où le fait qu'il vous indique que "la colonne « dateparution » est de type date mais l'expression est de type character varying".

Vous devriez avoir plus de chance en indiquant les colonnes... comme ceci :

CREATE RULE sujet_insert AS ON INSERT TO ALLSUJET DO INSTEAD
    INSERT INTO LGPSUJET (numsujet, auteur, titre, texte) VALUES
    (default,
    current_user,
    NEW.TITRE,
    NEW.TEXTE);

D'ailleurs, vous l'avez fait pour l'exemple que vous avez utilisé pour montrer que le INSERT fonctionne...

Et tant qu'on y est, pas la peine d'indiquer la première colonne, elle a une valeur par défaut.


Guillaume.

Hors ligne

#3 08/01/2012 02:58:50

Morby
Membre

Re : Prb avec fonction current_date dans une règle

merci bcp pour cette lumineuse explication, j'essayerais ça demain car là, j'ai les paupières qui tombent ^^

EDIT : ça fonctionne nickel, encore merci
sujet clos

Dernière modification par Morby (08/01/2012 14:38:18)

Hors ligne

Pied de page des forums