【问题标题】:database triggers to populate current date on row insert and update not working数据库触发器在行插入和更新时填充当前日期不起作用
【发布时间】:2015-01-30 07:46:04
【问题描述】:

功能-

创建函数:

-- Function: created_func()

CREATE OR REPLACE FUNCTION created_func()
  RETURNS trigger AS
$BODY$
    BEGIN
        -- Remember who changed the payroll when
        NEW.created_ts := current_timestamp;
        RETURN NEW;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION created_func()
  OWNER TO postgres;

更新功能:

-- Function: updated_func()

CREATE OR REPLACE FUNCTION updated_func()
  RETURNS trigger AS
$BODY$
    BEGIN
        -- Remember who changed the payroll when
        NEW.updated_ts := current_timestamp;
        RETURN NEW;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION updated_func()
  OWNER TO postgres;

触发器-

创建触发器:

-- Trigger: created_func on drcschema.dr_event

CREATE TRIGGER created_func
  BEFORE INSERT
  ON drcschema.dr_event
  FOR EACH ROW
  EXECUTE PROCEDURE created_func();

更新触发器:

-- Trigger: update_func on drcschema.dr_event

CREATE TRIGGER update_func
  AFTER UPDATE
  ON drcschema.dr_event
  FOR EACH ROW
  EXECUTE PROCEDURE updated_func();

列-

created_ts:

-- 列:created_ts

ALTER TABLE drcschema.dr_event ADD COLUMN created_ts timestamp without time zone;

updated_ts:

-- 列:updated_ts

ALTER TABLE drcschema.dr_event ADD COLUMN updated_ts timestamp without time zone;

DrEvent.hbm.xml:

<property name="createdTs" type="timestamp" generated="insert">
   <column name="created_ts" length="29" />
</property>
<property name="updatedTs" type="timestamp" generated="always">
   <column name="updated_ts" length="29" />
</property>

插入和更新行后,我仍然没有在updated_ts 列中获得日期,如下所示-

【问题讨论】:

  • 您无法更改 AFTER UPDATE 触发器中的列。您需要一个 BEFORE UPDATE 触发器

标签: java postgresql triggers


【解决方案1】:

您需要一个BEFORE UPDATE 触发器,否则更改将不会持续到表中。

除此之外,触发器功能非常相似,最好将它们组合成一个,以便“业务逻辑”在一个地方,从而更容易维护:

CREATE OR REPLACE FUNCTION ins_upd_func() RETURNS trigger AS $BODY$
BEGIN
  -- Remember who changed the payroll when
  IF TG_OP = 'INSERT' THEN
    NEW.created_ts := current_timestamp;
  ELSE
    NEW.updated_ts := current_timestamp;
  END IF;
  RETURN NEW;
END; $BODY$ LANGUAGE plpgsql VOLATILE;

还有触发器:

CREATE TRIGGER ins_upd_tr
BEFORE INSERT OR UPDATE ON drcschema.dr_event
FOR EACH ROW EXECUTE PROCEDURE ins_upd_func();

【讨论】:

  • 好的,它工作正常,但请你解释一下,当第一次插入行时,updated_ts 是如何用你上面的逻辑用current_timestamp 更新的?我以为TG_OP = 'INSERT' 只会为created_ts 填充current_timestamp,而其他部分将被丢弃。
  • @MyGod:所以你想在第一次插入时也填充updated_ts 列?
  • 您的上述逻辑也是如此。它也在第一次插入时填充updated_ts 列。虽然我也希望它被填充,但无法理解这个逻辑是如何做到的。
  • 这是不可能的,至少从触发器中的代码来看是不可能的。您能否展示用于将数据插入表drcschema.dr_eventINSERT 语句?
猜你喜欢
  • 2018-12-10
  • 2013-03-06
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多