我在C#中有我的核心项目.
我在一个数据库上工作,其中一些表有"user_mod"和"date_mod"列用于签名谁和什么时候做了一些mods和"data_new"和"user_new"相同.
我的问题:有没有办法集中这个并自动插入这些数据,我在哪里创建实例dbContext
?
如果没有,我将使用审计跟踪工具.我见过其中的一些,但是有一个问题:所有这些,需要我的模型中的一些代码.但是我不想在我的模型中写,因为如果我必须改变它,我将失去mod.是否可以在不写入模型文件的情况下使用EF6的审计跟踪?怎么样?
编辑:
我试图覆盖saveChanges.
public partial class PieEntities : DbContext
{
public override int SaveChanges(System.Data.Objects.SaveOptions options)
{
var timestamp = DateTime.Now;
EntityState es = EntityState.Added;
ObjectStateManager o = new ObjectStateManager();
foreach (ObjectStateEntry entry in o.GetObjectStateEntries(EntityState.Added )) {
if (entry.Entity.GetType() == typeof(TabImpianti)) {
TabImpianti impianto = entry.Entity as TabImpianti;
impianto.DATA_INS = timestamp;
impianto.DATA_MOD = timestamp;
string u = mdlImpostazioni.p.UserName;
impianto.USER_INS = u;
impianto.USER_MOD = u;
}
}
return base.SaveChanges(options);
}
}
Run Code Online (Sandbox Code Playgroud)
我们计划在数据库中引入简单的Audit Trail,使用触发器和每个需要审计的表的单独历史表.
例如,考虑表StudentScore,它具有很少的外键(例如,StudentID,CourseID)将其链接到相应的父表(学生和课程).
Table StudentScore (
StudentScoreID, -- PK
StudentID ref Student(StudentID), -- FK to Student
CourseID ref Course(CourseID), -- FK to Course
)
Run Code Online (Sandbox Code Playgroud)
如果StudentScore需要审核,我们计划创建审核表StudentScoreHistory -
Table StudentScoreHistory (
StudentScoreHistoryID, -- PK
StudentScoreID,
StudentID,
CourseID,
AuditActionCode,
AuditDateTime,
AuditActionUserID
)
Run Code Online (Sandbox Code Playgroud)
如果StudentScore中的任何行被修改,我们会将旧行移至StudentScoreHistory.
在设计讨论期间提出的一点是在StudentHistory表中将StudentID和CourseID设为FK,以保持参照完整性.支持这一点的论据是因为我们总是主要做一个软(逻辑布尔标志)删除而不是硬删除,它有利于维护引用完整性以确保我们在审计表中没有任何孤立ID.
Table StudentScoreHistory (
StudentScoreHistoryID, -- PK
StudentScoreID,
StudentID ref Student(StudentID), -- FK to Student
CourseID ref Course(CourseID), -- FK to Course
AuditActionCode,
AuditDateTime,
AuditActionUserID
)
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎有点奇怪.我同意@Jonathan Leffler的评论,即审计记录不应该停止删除父数据.相反,如果需要,则应通过主表中的外键处理,而不是在审计表中处理.我想得到你的意见,以确保我没有错过将外键扩展到审计表的一些价值.
现在我的问题是: 在历史表中使用这些外键是一个好的设计吗?
关键参数的任何细节(性能,最佳实践,设计灵活性等)将受到高度赞赏.
为了寻找特定目的和环境的人的利益:
目的:
人们在相当复杂的数据库中维护数据更改历史记录的成功策略是什么?我经常使用和开发的应用程序之一可以真正受益于更全面的跟踪记录随时间变化的方式.例如,现在记录可以具有多个时间戳和修改的用户字段,但是我们目前没有用于记录多个更改的方案,例如,如果回滚操作.在完美的世界中,可以在每次保存之后重建记录,等等.
关于DB的一些信息:
是否有一个很好的策略来记录ASP MVC应用程序上的用户活动?(ActionFilters/HTTPModules).
像上次用户活动的东西(就像StackOverflow"23分钟前看到的那样"),甚至是使用的页面和控制器,并进一步推动了点击的按钮或链接.
我安装了ELMAH但据我所知它只是用于错误记录.
PD:谷歌分析不是一个选项.
我正在开发一个新的Web应用程序,我需要将数据库中的任何更改存储到审计表中.此类审计表的目的是在稍后的实际物理审计中,我们可以确定在某种情况下发生了什么,谁在编辑复杂计算时编辑了什么以及db的状态.因此,大多数审计表都将被编写而不会被读取.有时可能会生成报告.
我找了可用的解决方案
我没有尝试过这些中的任何一个,所以我想知道一些真实的经历以及我应该使用的经验.例如哪一个更快,占用空间更小,易于扩展和维护?
我们正在使用asp.net和sql server开发一个Web应用程序.我们需要为应用程序执行审计跟踪.据我了解,审计跟踪基本上适用于数据库中的所有插入,更新和删除吗?现在解决这个问题的方法是,我在DB中有一个审计跟踪表,在每次插入,更新或删除之后填充(在DAL中手动编写脚本).但是,不会记录从SQL Management Studio直接触发的任何数据库更改(原因很明显:P).
为了迎合这一点,我可以创建一个触发器,并处理所有事情.我也做了一些谷歌搜索,发现SQL服务器有能力进行审计跟踪.但是,使用触发器的问题是我不会获得登录网站的用户信息.我会得到sql用户,但我没有给出两个hoots,我担心网站用户.
我想出的解决方案是a)从我的Web应用程序中获得审计跟踪并设置触发器.在审计报告中,我只是显示来自Web应用程序的审计日志和来自sql server的审计日志.这种方法明显存在问题:头脑清醒.在每个DB CHANGE上写入两组不同的表.
b)我有一个名为UserId ON EVERY DB TABLE的列.然后我创建一个触发器来捕获所有数据库更改.我在我更改的每个表(插入,更新,删除)上传递此userId,并从触发器获取此id.显而易见的挫折:每个表中不必要的用户ID列
我为长篇文章道歉.基本上我需要一个审计日志,它记录所有数据库更改(包括直接破解到数据库),但同时给我用户登录信息,用于从Web应用程序进行的那些数据库更改.
将欣赏这方面的任何意见.
非常感谢
xeshu
什么是适合以下的数据库?我对你使用非关系型NoSQL系统的经历特别感兴趣.它们是否适用于这种用法,您使用过哪个系统并建议使用,或者我应该使用普通的关系数据库(DB2)?
我需要将来自一堆源的审计跟踪/日志记录类型信息收集到中央服务器,在那里我可以有效地生成报告并检查系统中发生的情况.
通常,审计/日志记录事件总是包含一些必填字段
此外,该事件可能包含0-N键值对,其中值可能高达几千字节的文本.
我现在已经阅读了几个主题并做了一些关于将更改记录到mysql表的研究.首先让我解释一下我的情况:
我有一张带桌子的票务系统:'票'
截至目前,我已经创建了触发器,它将在我的表中输入一个重复的条目:'ticket_history',其中"action" "user"和"timestamp"作为附加列.经过几周的测试和测试后,我对这个版本感到不满,因为每次更改都会在历史记录表中创建我的行的完整副本.我确实知道磁盘空间很便宜,我不应该担心它,但是为了找回用户的某种日志或漂亮的历史是痛苦的,至少对我来说是这样.还有我写过的触发器,即使没有变化,我也会在历史记录中获得新的一行.但这只是我触发器的设计缺陷!
这是我的触发器:
BEFORE UPDATE ON ticket FOR EACH ROW
BEGIN
INSERT INTO ticket_history
SET
idticket = NEW.idticket,
time_arrival = NEW.time_arrival,
idticket_status = NEW.idticket_status,
tmp_user = NEW.tmp_user,
action = 'update',
timestamp = NOW();
END
Run Code Online (Sandbox Code Playgroud)
在花了一些时间讨论这个话题之后,我想出了一个我想讨论和实现的方法.但首先我会对此有一些疑问:
我的想法是创建一个新表:
id sql_fwd sql_bwd keys values user timestamp
-------------------------------------------------------------------------
1 UPDATE... UPDATE... status 5 14 12345678
2 UPDATE... UPDATE... status 4 7 12345678
Run Code Online (Sandbox Code Playgroud)
在我看来,流程看起来像这样:
首先,我会从数据库中选择一些或更多内容:
SELECT keys FROM ticket; …
在我深入研究Microsoft文档的深渊之前,我想知道是否有经验的变更数据捕获和变更跟踪知道是否可以使用其中一个或两个来取代传统...
"由Triggers插入的'真实表'的审计跟踪表副本(原始表的所有字段,加上日期/时间,用户ID和DML操作字段)"
...设置数据库表审计跟踪,其中触发器填充审计跟踪表(这是所有手动工作).
MSDN概述文档在很高的层次上解释了变更数据捕获和变更跟踪的内容,但对我来说还不够明确,并且没有直截了当地说明这些工具可以用来取代传统的审计跟踪表.经常做的.
有经验使用变更数据捕获和变更跟踪的人可以节省我很多时间,还是确认我花时间看正确的工具?我们审计跟踪的关键部分是捕获对表的字段(INSERT,UPDATE,DELETE)的所有更改,何时发生,以及由谁完成.这些更改通常通过审计跟踪报告按时间顺序提供给最终用户.这是另一个问题......更改数据捕获或更改跟踪是解决方案,我假设可以像普通表中的数据一样查询此数据?
编辑:我需要一个永久的审计跟踪,无论时间.我看到Change Data Capture与事务日志有关,所以这对我来说听起来很有限.
change-tracking change-data-capture audit-trail sql-server-2008
我需要获得连续更改的所有值,并在其他"审计"表上发布修改.我是否可以完成此操作,而无需为行中的每个元素编写条件?我知道来自http://www.firebirdfaq.org/faq133/的SQL,它为您提供了验证的所有条件:
select 'if (new.' || rdb$field_name || ' is null and old.' ||
rdb$field_name || ' is not null or new.' || rdb$field_name ||
'is not null and old.' || rdb$field_name || ' is null or new.' ||
rdb$field_name || ' <> old.' || rdb$field_name || ') then'
from rdb$relation_fields
where rdb$relation_name = 'EMPLOYEE';
Run Code Online (Sandbox Code Playgroud)
但这应该写在触发器中.所以,如果我改变一个表,那么我需要修改触发器.
由于FireBird不允许动态增加varchar变量的大小,因此在将其插入文本blob之前,我考虑将所有值转换并连接到一个大的varchar变量.
audit-trail ×10
database ×3
audit ×2
logging ×2
sql ×2
asp.net ×1
asp.net-mvc ×1
c# ×1
crud ×1
django ×1
firebird ×1
firebird2.5 ×1
mysql ×1
nosql ×1
php ×1
postgresql ×1
reversion ×1
sql-server ×1
triggers ×1