是否可以在 Audit table 中使用单独的列来存储列名以反映所做的更改
Is it OK to have separate column in Audit table to store column name to reflect what changes were made
存储列名以表示父级 table 中的数据所做的更改导致触发审计是一种好的做法。
例如:-
create table employee
(
emp_id character varying(10),
fname character varying(30),
lname character varying(30),
tel_no character varying(15)
);
create table aud_employee
(
emp_id character varying(10),
fname character varying(30),
lname character varying(30),
tel_no character varying(15)
aud_col_changed character varying(100)
);
--
insert into employee values('215','Mark','Cooper','222-458-254');
这也将导致通过触发器在审计 table 中插入记录,并且 aud_col_changed 列中的值为空值。
现在当我更新同一条记录时:-
update employee set tel_no='255-458-254' where emp_id='215';
因此,还将为此次更新创建审计,审计 table 现在应该包含另一条记录,并且将包含 aud_col_changed 列中的值 'tel_no'。
如果一次更改多个列,将在同一字段中以逗号分隔。
如果这是正确的方法,您能描述一下实现它的方法吗?
请注意,我尝试在其上实施此方法的 table 有大约 18 列,其中 6-7 列是 JSON。
您的方法可能没问题 -- 您应该指定要对审计执行的操作 table。
就我个人而言,我宁愿 table 审计 table 是以下之一:
- 每列更改一行,包含旧值和新值。
- 每 行 更改一行,所有列出现两次,一次用于旧值,一次用于新值。
换句话说,我通常希望同时看到旧值和新值。
第一种方法在处理具有不同类型的列时比较棘手。当你想修改 table.
的结构时,第二个是棘手的
我做了更多研究,发现如果我们想存储列名,则需要通过函数更新数据。在函数中,我们需要检查每个传递给 NOT NULL 的值。如果它看起来不为空,那么我们需要对列名进行硬编码并将其分配给变量。如果发现更多非 NULL 的值,则需要将该硬编码列名称附加到主变量,直到我们使用 NOT NULL 检查函数中传递的所有值。
这肯定会降低数据库的性能,并且在每次更新后使其成为 运行 显然是不可取的。
因此,我不喜欢使用 audit_col_changed 列。
存储列名以表示父级 table 中的数据所做的更改导致触发审计是一种好的做法。
例如:-
create table employee
(
emp_id character varying(10),
fname character varying(30),
lname character varying(30),
tel_no character varying(15)
);
create table aud_employee
(
emp_id character varying(10),
fname character varying(30),
lname character varying(30),
tel_no character varying(15)
aud_col_changed character varying(100)
);
--
insert into employee values('215','Mark','Cooper','222-458-254');
这也将导致通过触发器在审计 table 中插入记录,并且 aud_col_changed 列中的值为空值。
现在当我更新同一条记录时:-
update employee set tel_no='255-458-254' where emp_id='215';
因此,还将为此次更新创建审计,审计 table 现在应该包含另一条记录,并且将包含 aud_col_changed 列中的值 'tel_no'。
如果一次更改多个列,将在同一字段中以逗号分隔。
如果这是正确的方法,您能描述一下实现它的方法吗?
请注意,我尝试在其上实施此方法的 table 有大约 18 列,其中 6-7 列是 JSON。
您的方法可能没问题 -- 您应该指定要对审计执行的操作 table。
就我个人而言,我宁愿 table 审计 table 是以下之一:
- 每列更改一行,包含旧值和新值。
- 每 行 更改一行,所有列出现两次,一次用于旧值,一次用于新值。
换句话说,我通常希望同时看到旧值和新值。
第一种方法在处理具有不同类型的列时比较棘手。当你想修改 table.
的结构时,第二个是棘手的我做了更多研究,发现如果我们想存储列名,则需要通过函数更新数据。在函数中,我们需要检查每个传递给 NOT NULL 的值。如果它看起来不为空,那么我们需要对列名进行硬编码并将其分配给变量。如果发现更多非 NULL 的值,则需要将该硬编码列名称附加到主变量,直到我们使用 NOT NULL 检查函数中传递的所有值。 这肯定会降低数据库的性能,并且在每次更新后使其成为 运行 显然是不可取的。
因此,我不喜欢使用 audit_col_changed 列。