[英]user creation dumping using trigger and fucntions
由於 PostgreSQL 不轉儲 object 創建日期,所以我想通過使用觸發器和函數手動轉儲用戶創建日期。 我已經創建了觸發器和函數,但它不起作用。
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,usename,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
);
現在是 function,我檢查OLD.username
是否為 null,這意味着這是一個插入,如果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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.