Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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...
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
Pages : 1