SQL数据库已删除标记和DeletedBy DeletedOn

时间:2012-04-11 15:44:46

标签: sql sql-server

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

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

我打算在这个问题中问哪个更好的做法:

  1. 拥有额外的位列

  2. 使用已存在的可空列来识别已删除的行

  3. 但我开始认为这是一种偏好。所以我的问题是,哪个更有效率?如果此表变得庞大,运行是否会带来性能提升:

        Select * from MyTable where [Deleted] = 1
    

        Select * from MyTable where [DeletedBy] is not null
    

5 个答案:

答案 0 :(得分:2)

这是一种偏好。从技术上讲,datetime字段是larger而不是bit字段,但是因为无论如何都需要存储它并不重要。无论性能如何,您都可以索引并得到相同的结果。我个人认为bit字段是多余的,并使用可空的datetime

答案 1 :(得分:1)

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

答案 2 :(得分:1)

你确实需要知道谁删了,所以DeletedBy专栏必须留在那里。这是一个主要问题:你应该保留位列吗?

答案很简单:没有:) 我知道这只是一些列,并没有占用太多,但很多行有点乘以很多位。当然,它可能不会影响您的存储,但在这种情况下没有理由保留冗余数据。

关于您可能拥有的已删除= 1字段,只需将DeletedBy更新为类似“系统”或类似内容,告诉您在执行新字段之前删除了记录

答案 3 :(得分: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

答案 4 :(得分:0)

对于大型表我真的不喜欢使用软删除,我更喜欢归档,但我知道所有项目都不同。

我可能只是在主表上保留'DeletedBy'标志,因为它的开销稍微少一些,并创建一个带有'DeletedBy'和'Timestamp'的DeletionLog表用于审计

这在高读取环境中尤其有用。