问题描述
由于 Postgresql 不转储对象创建日期,所以我想通过使用触发器和函数手动转储用户创建日期。我已经创建了触发器和函数,但它不起作用。
CREATE TABLE user_audits (
usesysid INT GENERATED ALWAYS AS IDENTITY,usename varchar NOT NULL,created_on TIMESTAMP(6) NOT NULL
);
============================
CREATE OR REPLACE FUNCTION user_creation()
RETURNS TRIGGER
LANGUAGE PLPGsql
AS
$$
BEGIN
IF NEW.usename <> OLD.usename THEN
INSERT INTO user_audits(usesysid,usename,created_on)
VALUES(usesysid,Now());
END IF;
RETURN NEW;
END;
$$
=================================
CREATE TRIGGER user_creation
BEFORE UPDATE
ON user
FOR EACH ROW
EXECUTE PROCEDURE user_creation();
这对于审计目的很重要,现在我使用日志文件来检查创建日期,但它会在一段时间后轮换。 请建议在表中转储用户创建日期的更好方法,以便我可以随时检索信息。 谢谢
解决方法
我使用以下表格创建了一个类似的练习:
-
user_tbl
表只有一个标识列usersysid
和username
CREATE TABLE user_tbl (
usersysid INT GENERATED ALWAYS AS IDENTITY,username varchar NOT NULL
);
-
user_audits
表,您的表略有修改:我在其中添加了id
标识字段。我从usersysid
字段中删除了标识(因为它将填充来自user_tbl
的标识)
CREATE TABLE user_audits (
id INT GENERATED ALWAYS AS IDENTITY,usersysid INT,username varchar NOT NULL,created_on TIMESTAMP(6) NOT NULL
);
现在函数,我检查 OLD.username
是否为空,这意味着这是一个插入,如果 NEW.username <> OLD.username
那么是一个更新。
CREATE OR REPLACE FUNCTION user_creation()
RETURNS TRIGGER
LANGUAGE PLPGSQL
AS
$$
BEGIN
IF OLD.username is null OR NEW.username <> OLD.username THEN
INSERT INTO user_audits(usersysid,username,created_on)
VALUES(NEW.usersysid,NEW.username,now());
END IF;
RETURN NEW;
END;
$$
;
最后是触发器,它在 INSERT
或 UPDATE
CREATE TRIGGER user_creation
BEFORE INSERT OR UPDATE
ON user_tbl
FOR EACH ROW
EXECUTE PROCEDURE user_creation();
现在,如果我创建两个新行并使用以下内容更新其中一个
insert into user_tbl (username) values('Carlo');
insert into user_tbl (username) values('Gianni');
update user_tbl set username='Giorgio' where usersysid=1;
我最终得到包含 2 个预期行的 user_tbl
defaultdb=> select * from user_tbl;
usersysid | username
-----------+----------
2 | Gianni
1 | Giorgio
(2 rows)
以及包含 3 行的 user_audits
表(2 用于插入 + 1 用于更新)
defaultdb=> select * from user_audits;
id | usersysid | username | created_on
----+-----------+----------+----------------------------
1 | 1 | Carlo | 2021-06-04 13:57:44.810889
2 | 2 | Gianni | 2021-06-04 13:58:14.680878
3 | 1 | Giorgio | 2021-06-04 13:58:44.702364
(3 rows)