我的数据库包含以下表格:
products
product_features
customers
payments
还有一个users
表可以修改,删除或添加上表中的任何项目。
然后我试图存储所有这些操作,我也想启用或禁用产品或product_features(不仅删除)。
所以我想创建一个名为logs的新表,其中包含以下字段:
id_log
action (delete, update, add)
id_user
table_afected (products, product_features, customers, payments)
id_affected
enabled
date_added
date_modified
然后我将使用mySQL触发器以这种方式设置用户: https://stackoverflow.com/a/8621168/2154101
现在假设我要保存正在修改的id_affected的字段。我怎么能处理呢?
答案 0 :(得分:0)
如果要保存所有更改(在每个表上修改了哪些字段),那么数据库触发器将是一个很好的方法。
您可以传递参数的另一种更灵活的方法是使用您想要的所有逻辑和规则从应用程序中手动插入
关于保存ID,这是一项简单的任务。通常所做的是有一个表(让我们调用i LOG),其中包含字段(TABLE_NAME,FIELD_NAME,OLD_VALUE,NEW_VALUE,KEY或ID)。在这个表中你保存了例如('USERS','FIRSTNAME','Johnny','John',234),你会知道有人做过类似的更新 更新USERS设置FIRSTNAME ='John',其中ID = 234
列OLD_VALUE和NEW_VALUE可以是VARCHAR类型(如果需要支持更大的数据,则为CLOB),以便存储任何类型的字段值。
关于触发器的好处是,如果从您的应用程序进行修改,它们将触发,如果修改是直接从数据库完成的,则会触发它们作为DBA完成的SQL更改。
答案 1 :(得分:0)
是的,每次更改都会插入一个新行。
另一种方法是,如果您希望将内容保存在一行中,则可以将其用于OLD_VALUE,将NEW_VALUE用于CLOB字段并使用XML
<FIELD_VALUES>
<FIELD1>value1</FIELD1>
<FIELD2>value2</FIELD2>
...
</FIELD_VALUES>
然后在您的应用程序中,您可以解析此XML,甚至可以使用已修改的字段显示日志颜色
作为一个选项,您可以保存所有字段,也可以保存修改后的字段,无论您喜欢什么。