簡體   English   中英

使用觸發器和函數進行用戶創建轉儲

[英]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();

這對於審計目的很重要,因為現在我使用日志文件來檢查創建日期,但它會在一段時間后輪換。 請建議將用戶創建日期轉儲到表中的更好方法,以便我可以隨時檢索信息。 謝謝

我用下表創建了一個類似的練習:

  1. user_tbl表只有一個標識列usersysidusername
CREATE TABLE user_tbl (
   usersysid INT GENERATED ALWAYS AS IDENTITY,
   username varchar NOT NULL
);
  1. 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;
$$
;

最后是觸發器,它在INSERTUPDATE上都被觸發

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM