我们的 Postgres 表之一名为rep_event,有一个时间戳列,指示插入每一行的时间。但所有行的时间戳值为 2000-01-01 00:00:00,因此某些内容设置不正确。
有一个函数可以将行插入到表中,并且它是唯一将行插入到该表中的代码 - 没有其他代码插入到该表中。 (也没有任何代码更新该表中的行。)以下是该函数的定义:
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() 函数来获取当前时间。在数据库上执行“select now()”会返回正确的时间,那么从函数内调用 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()
);
然后您可以摆脱触发器中的 now() 调用。
另外,作为旁注,我强烈建议在您的函数中包含列排序...... IOW;
INSERT INTO rep_event (operation,table_name,object_id,time_stamp) SELECT ...
这样,如果您添加新列或进行其他表更改来更改表的内部顺序,您的函数就不会突然中断。
关于postgresql - 在函数中调用 now(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6618189/