rep_eventというPostgresテーブルの1つに、各行がいつ挿入されたかを示すtimestamp列があります。しかし、すべての行のタイムスタンプ値は2000-01-01 00:00:00なので、何かが正しく設定されていません。関数内でnow()を呼び出す
行をテーブルに挿入する関数があり、それはそのテーブルに行を挿入する唯一のコードであり、他のコードはそのテーブルに挿入されません。 (また、そのテーブルの行を更新するコードがありません。)ここでは関数の定義である:ここで
CREATE FUNCTION handle_event() RETURNS "trigger"
AS $$
BEGIN
IF (TG_OP = 'DELETE') THEN
INSERT INTO rep_event SELECT 'D', TG_RELNAME, OLD.object_id, now();
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO rep_event SELECT 'U', TG_RELNAME, NEW.object_id, now();
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO rep_event SELECT 'I', TG_RELNAME, NEW.object_id, now();
RETURN NEW;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
テーブル定義されています
CREATE TABLE rep_event
(
operation character(1) NOT NULL,
table_name text NOT NULL,
object_id bigint NOT NULL,
time_stamp timestamp without time zone NOT NULL
)
あなたが見ることができるように、現在時刻を取得するためにnow()関数が呼び出されます。データベース上で「今すぐ選択」()を実行すると正しい時刻が返されるため、関数内からnow()を呼び出す際に問題がありますか?
CREATE TABLE rep_event (
operation character(1) NOT NULL,
table_name text NOT NULL,
object_id bigint NOT NULL,
time_stamp timestamp without time zone NOT NULL DEFAULT NOW()
);
その後、あなたは(今を取り除くことができます)あなたのトリガーに呼び出します。
トリガー定義を表示できますか?どんなテーブルに結びついていますか? – Flimzy
非常に奇妙です。関数の中で 'now()'を呼び出すのに問題はありません。他にもいくつか問題があると思います。 BTWは、作成/修正タイムスタンプであることを意図しているならば、 "タイムゾーン付きのタイムスタンプ"(直感的ではないが、そうである)であるべきであり、 'now()'ではなく 'CURRENT_TIMESTAMP'しかし、これは必須ではありません。 – leonbloy