Java 数据库触发器填充行插入和更新的当前日期无效 功能-

Java 数据库触发器填充行插入和更新的当前日期无效 功能-,java,postgresql,triggers,Java,Postgresql,Triggers,创建函数: -- 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$ LAN

创建函数:

-- 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();
<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>
更新功能:

-- 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();
<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>
触发- 创建触发器:

-- 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();
<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>
更新触发器:

-- 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();
<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>
纵队- 已创建\u ts:

-- 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();
<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>
--列:已创建

ALTER TABLE drcschema.dr_event ADD COLUMN created_ts timestamp without time zone;
更新内容:

-- 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();
<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>
--专栏:更新版

ALTER TABLE drcschema.dr_event ADD COLUMN updated_ts timestamp without time zone;
DrEvent.hbm.xml:

-- 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();
<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\u ts
列中获得日期,如下所示-


在更新之前,您需要一个
触发器,否则更改将不会保留到表中

除此之外,对于如此相似的触发器功能,最好将它们合并为一个,以便“业务逻辑”位于一个位置,从而更易于维护:

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();

无法更改更新后触发器中的列。您需要一个更新前触发器OK它工作正常,但请您解释一下,当第一次插入行时,
updated\u ts
如何使用您的上述逻辑用
current\u timestamp
进行更新?我以为
TG\u OP='INSERT'
只会为
创建的
填充
当前的时间戳,其余部分将被丢弃。@MyGod:那么你想在第一次插入时填充
更新的
列吗?你上面的逻辑也是这样做的。它也在第一次插入时填充
updated\u ts
列。虽然我也希望填充它,但无法理解这个逻辑是如何实现的。这是不可能的,至少从触发器中的代码是不可能的。能否显示用于将数据插入表
drcschema.dru事件
INSERT
语句?