gpt4 book ai didi

postgresql - 如何从 SELECT 创建 INSERT 日志?

转载 作者:行者123 更新时间:2023-12-04 08:30:12 29 4
gpt4 key购买 nike

作为学校工作,我们应该创建一个表,将用户在另一个表上完成的所有操作记录下来。更清楚地说,说我有 表1 日志表 ,table1 可以包含任何信息(名称、ID、工作等),logtable 包含有关谁在 table1 上做什么的信息。使用函数和触发器,我设法使 INSERT、DELETE 和 UPDATE 操作成为登录的日志表,但我们也应该保留 SELECT 的日志。要更具体地了解 SELECT,请在 中查看 如果您执行 SELECT,这应该通过 INSERT 登录到 logtable,本质上 logtable 应该有一个新行,其中包含告诉某人执行了 SELECT 的信息。我的问题是我想不出任何方法来实现这一点,因为 SELECT 不能使用触发器,反过来也不能使用函数,并且规则不允许发生两种不同的操作。唯一接近的是使用查询日志,但是由于数据库是学校的而不是我的,我无法使用它们。
这是我正在使用的粗略示例(实际上 tstamp 有几小时分钟等等):

id   operation       hid       tablename       who       tstamp        val_new       val_old
x INSERT x table1 name YYYY-MM-DD newValues previousValues
这按预期工作,但我还需要开始工作的是(注意:在这种情况下,val_new 和 old 是否为空不是问题):
id   operation       hid       tablename       who       tstamp        val_new       val_old
x SELECT x table1 name YYYY-MM-DD NULL previousValues
任何和所有的帮助表示赞赏。

最佳答案

下面是一个例子:

CREATE TABLE public.test (id integer PRIMARY KEY, value integer);

INSERT INTO test VALUES (1,42),(2,13);

CREATE TABLE test_log(id serial primary key, dbuser varchar,datetime timestamp);

-- get_test() inserts username / timestamp into log, then returns all rows
-- of test

CREATE OR REPLACE FUNCTION get_test() RETURNS SETOF test AS '
INSERT INTO test_log (dbuser,datetime)VALUES(current_user,now());
SELECT * FROM test;'
language 'sql';

-- now a view returns the full row set of test by instead calling our function

CREATE VIEW test_v AS SELECT * FROM get_test();


SELECT * FROM test_v;
id | value
----+-------
1 | 42
2 | 13
(2 rows)

SELECT * FROM test_log;
id | dbuser | datetime
----+----------+----------------------------
1 | postgres | 2020-11-30 12:42:00.188341
(1 row)
如果您的表有很多行和/或选择很复杂,出于性能原因,您不想使用此 View 。

关于postgresql - 如何从 SELECT 创建 INSERT 日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65064541/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com