2017-08-13 1 views
0

J'ai créé le déclencheur suivant dans mon environnement PostgreSQL pour bloquer les insertions de 0000-00-00 00:00:00 dans mon horodatage champ de type de données, car il n'est pas pris en charge.PostgreSQL avant l'insertion du déclencheur pour le blocage 0000-00-00 00:00:00

create function my_trigger_func() returns trigger as $$ 
begin 
    if NEW.t_date = '0000-00-00 00:00:00' then 
     NEW.t_date := '0001-01-01 00:00:00'; 
    end if; 
    return new; 
end 
$$ language plpgsql; 

CREATE TRIGGER my_trigger 
BEFORE INSERT ON timezone.test 
FOR EACH ROW 
EXECUTE PROCEDURE my_trigger_func() 

La fonction de déclenchement ci-dessus est créée avec succès. Mais après, quand j'exécutez la commande d'insertion ci-dessous:

Insert into timezone.test (t_id,t_date) values ('3','0001-01-01 01:10:01'); 

Je reçois l'erreur suivante:

ERROR: date/time field value out of range: "0000-00-00 00:00:00" 
LINE 1: SELECT NEW.t_date = '0000-00-00 00:00:00' 
          ^
QUERY: SELECT NEW.t_date = '0000-00-00 00:00:00' 
CONTEXT: PL/pgSQL function my_trigger_func() line 3 at IF 
********** Error ********** 

ERROR: date/time field value out of range: "0000-00-00 00:00:00" 
SQL state: 22008 
Context: PL/pgSQL function my_trigger_func() line 3 at IF 

bien vouloir me faire savoir où je vais mal.

Répondre

2

Kindly let me know where am I going wrong.

simple, vous essayez de comparer:

IF NEW.t_date   = '0000-00-00 00:00:00' THEN 
    (type timestamp)  literal -> conversion to Timestamp 

'0000-00-00 00:00:00' -> horodatage non valide

Et à cause de ce déclencheur, vous ne pouvez pas insérer des valeurs correctes même. Je suggère de le corriger dans l'application et d'insérer des valeurs appropriées.

+3

Ce qui semble indiquer que vous n'aviez pas besoin du déclencheur en premier lieu (la base de données rejetterait quand même les données invalides). Ce que vous voulez peut-être, c'est une fonction personnalisée qui convertit de varchar à date et corrige une entrée invalide de la façon que vous décrivez (ou laissez simplement le code de l'application gérer). – Thilo

+0

@ lad2025: Merci pour votre commentaire. Mais n'est-il pas possible de modifier le déclencheur ci-dessus pour ignorer ces valeurs et les remplacer à la place par les bonnes. – arsm4

+0

@Thilo Pouvez-vous s'il vous plaît laissez-moi me guider plus sur la façon dont je peux créer cette fonction personnalisée avant que les insertions se produisent. La raison pour laquelle je dis cela, ma table a beaucoup de colonnes et à cause de cet horodatage non-supporté, rien n'est rempli dans d'autres colonnes qui sont exigées. Par conséquent, je voulais faire un déclencheur au niveau de la base de données pour corriger ces valeurs, de sorte que l'insertion entière n'échoue pas. J'espère que tu comprends – arsm4