2017-08-13 24 views
0

PostgreSQL環境で、挿入をブロックするために以下のトリガーを作成しました0000-00-00 00:00:00タイムスタンプデータ型フィールドはサポートされていないためです。PostgreSQLがブロックするための挿入トリガー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() 

上記のトリガ機能が正常に作成されます。私は次のエラーを取得しています

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

::私は以下のINSERTコマンドを実行したときにしかし、その後、

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 

は親切に私が間違っているつもりですどこ私に知らせてください。

答えて

2

Kindly let me know where am I going wrong.

シンプルな、あなたは比較してみてください:

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

'0000-00-00 00:00:00' - >無効なタイムスタンプ

そして、このため、トリガーのあなたも、正しい値を挿入することはできません。私はアプリケーションでそれを修正し、適切な値を挿入することをお勧めします。

+3

最初にトリガーを必要としなかったようです(データベースは無効なデータを拒否します)。おそらくあなたが望むのは、varcharから日付に変換し、あなたが記述している方法で無効な入力を修正する(またはアプリケーションコードがそれを処理させる)カスタム関数です。 – Thilo

+0

@ lad2025:ご意見ありがとうございます。しかし、上記のトリガを変更してそれらの値を無視し、代わりに正しい値に置き換える方法はありません。 – arsm4

+0

@Thilo挿入を行う前にこのカスタム関数をどのように作成すればよいか、もっと教えてください。なぜなら、私のテーブルには多くの列があり、このサポートされていないタイムスタンプがあるため、必要な他の列には何も表示されません。したがって、これらの値を修正するためにデータベースレベルでトリガーを作成し、挿入全体が失敗しないようにしたいと考えました。ご理解頂けるとありがたいです – arsm4

関連する問題