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
语句?