检查INSERT上的SQL引用约束,但不检查DELETE上的SQL引用约束

时间:2012-11-08 10:02:20

标签: c# sql entity-framework

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

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

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

3 个答案:

答案 0 :(得分:0)

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

不是删除用户记录,而是更改其状态以指示它已被删除,因此您的数据库仍具有参照完整性。

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

答案 1 :(得分:0)

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

坦率地说,如果一个用户被永久删除,那么知道世界卫生组织的用途是什么?除非你打算永远地困扰那个人或者不让那个用户参与你的库存...;)

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

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

答案 2 :(得分:0)

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

希望这有帮助