0

我的数据库中有一个 Logs 表,用于存储用户操作的记录。有一个 UserID 列,它是用户表的外键,用于在添加日志时检查 UserID 是否存在。但是,尝试删除用户会导致约束失败,因为它会在 Logs 表中留下一个不再存在于 Users 表中的 UserID。从日志中删除有问题的行不是一种选择,因为关键是要有持久的记录(这样我们基本上可以找出谁破坏了什么),所以删除该用户的所有操作反而违背了目的。

是否有一种简单的方法可以在插入新日志时检查约束(以确保用户当时存在)但在删除用户时不检查?我通过 LINQ 访问数据库,所以我的查询是在 C# 中,而不是 SQL,所以任何需要它的东西都出来了,但是我可以通过 MS SQL Server Management Studio 访问数据库,所以我可以用它做我喜欢的事情.

编辑稍作澄清:知道谁采取了行动的价值不仅在于问责制;它有助于确定问题是用户特定的、组织特定的还是系统范围的,这可以大大缩小可能原因的范围。一旦用户被删除,仍然值得保留他们的操作,并且出于各种原因了解该用户执行了哪些操作仍然很有用 - 例如,当追踪由一个用户执行某种特定组合的事情引起的问题时(例如. 两个动作分开很好,但当一个紧跟着另一个时会导致错误)。

4

3 回答 3

0

如果你真的想保留日志,你永远不应该完全删除用户。

与其删除用户记录,不如更改其状态以指示它已被删除,这样您的数据库仍然具有引用完整性。

或者,打开级联删除,这样当您删除用户时,所有日志都会同时被删除,这是维护参照完整性的另一种方式。

于 2012-11-08T10:11:09.253 回答
0

您可以使您的日志表主键(复合键)独立于用户 ID。更改索引 Logs 表的方式可以解决此问题。还要确保没有级联删除。

坦率地说,如果一个用户被永远删除,知道谁破坏了什么有什么用?除非你打算永远困扰那个人,或者永远不要让那个用户参与你的库存......;)

否则,如果该用户从系统中删除,您可以限制该用户的日志的搜索能力,如果这对您来说是一个有效的选项。

但是,保留一个至少包含 UserID 和 Name 的简单表根本不是一个坏主意。

于 2012-11-08T10:19:16.623 回答
0

如果你想知道谁打破了什么?对于已删除的记录,然后您可以在用户表中创建一个“Isactive”列作为位数据类型。在用户删除时,您可以将位值更改为“0”,而不是删除记录。用户创建时将该字段设置为 1。是场景的唯一选项。

希望这可以帮助

于 2012-11-08T10:49:27.113 回答