2012-04-11 105 views
0

我已将历史记录表添加到我的数据库。最初我添加了一个名为Deleted的位,如果该行被删除,则打算将其更新为1,否则每行都是更新。SQL数据库已删除标志并已删除已删除对于

然后我被告知我们需要记录谁删除了什么时候。所以我添加了Nullable [DeletedBy] [DeletedOn]字段。 在这一点上,我想知道这是否使我的删除位多余。您可以简单地查询表,检查DeletedBy不是Null的位置,如果您想查看哪个行被删除。

我打算问这个问题,这是更好的做法:

  1. 有额外位列

  2. 使用已经存在的空列,以确定删除行

但我开始认为这是一个偏好的事情。相反,我的问题是,哪个更有效?如果此表获取大量的,有没有性能增益来运行:

Select * from MyTable where [Deleted] = 1 

Select * from MyTable where [DeletedBy] is not null 
+0

试一试,让我们知道。添加几百万个虚拟记录并运行查询。 – asawyer 2012-04-11 15:46:48

+1

我想我的老板会杀了我,如果我添加了几百万行到工作数据库,但我想我可以在我的家庭盒子上安装一个SQL服务器试用版,并让它去那里 – 2012-04-11 15:47:38

+0

@MikeyMouse:难道你没有测试环境? :) – 2012-04-11 15:47:58

回答

2

这更是一个偏好。从技术上来说,datetime字段是larger而不是bit字段,但由于无论如何您都需要存储它,所以它并不重要。然而,性能明智,你可以索引或获得相同的结果。我个人认为bit字段是多余的,并使用空值datetime

+0

很酷,感谢您的建议 – 2012-04-11 15:55:01

1

如果您前一段时间添加了'DeletedBy'位,并且已经在您的实时数据库中记录了'已删除',那么您需要保留位域,因为您没有要输入的信息在这个阶段'删除'(我想象)。

+0

不,它还在测试中,并且表格是在前一天创建的,所以我想我可以擦掉那一列 – 2012-04-11 15:58:59

1

你确实需要知道谁删除了,所以DeletedBy列必须留在那里。这就产生了主要问题:你应该保留位列吗?

答案很简单:没有:) 我知道它只是一个比特列,它并不占用太多,但有很多行乘以很多位。它当然可能不会影响你的存储,但在这种情况下没有理由保留冗余数据。关于你可能有,只是更新DeletedBy成类似“系统”或东西,告诉你该纪录是在新的领域的实施

+0

很酷,看起来共识是删除该字段,谢谢 – 2012-04-11 16:02:33

1

你基本上创建之前被删除的删除= 1场

审计跟踪,而且很容易做到。首先,用审计信息的一些标准字段创建所有审计表。例如:

[audit_id] [int] IDENTITY(1,1) NOT NULL, 
[audit_action] [varchar](16) NOT NULL, 
[audit_date] [datetime] NOT NULL, 
[audit_user_name] [varchar](128) NOT NULL, 
--<your fields from the table being audited> 

将audit_date默认为值getdate()。如果您使用的是Active Directory安全性,则默认audit_user_name的值为suser_sname(),否则您必须在查询中提供此值。

现在,为要审计的表创建一个INSERT,UPDATE和DELETE触发器。您将把值写入您的审计表。下面是一个例子DELETE:

CREATE TRIGGER [dbo].[tr_my_table_being_audited_delete] 
    ON [dbo].[my_table_being_audited] 
    AFTER DELETE 
AS 
BEGIN 

SET NOCOUNT ON; 

INSERT INTO dbo.my_audit_trail_table (audit_action, --<your fields from the table being audited>) 
    SELECT 'DELETE', --<your fields from the table being audited> 
    FROM deleted 

END 
0

对于大规模的表我真的不喜欢使用软删除,我更喜欢归档,但我明白所有的项目是不同的。

,我可能只是继续主表中的“DeletedBy”标志,因为它少一点的开销,并创建“DeletedBy”和“时间戳”一DeletionLog表审核

这将是一个特别有益高阅读环境。