SQL数据库已删除标志并已删除已删除对于
我已将历史记录表添加到我的数据库。最初我添加了一个名为Deleted的位,如果该行被删除,则打算将其更新为1,否则每行都是更新。SQL数据库已删除标志并已删除已删除对于
然后我被告知我们需要记录谁删除了什么时候。所以我添加了Nullable [DeletedBy] [DeletedOn]字段。 在这一点上,我想知道这是否使我的删除位多余。您可以简单地查询表,检查DeletedBy不是Null的位置,如果您想查看哪个行被删除。
我打算问这个问题,这是更好的做法:
有额外位列
使用已经存在的空列,以确定删除行
但我开始认为这是一个偏好的事情。相反,我的问题是,哪个更有效?如果此表获取大量的,有没有性能增益来运行:
Select * from MyTable where [Deleted] = 1
在
Select * from MyTable where [DeletedBy] is not null
这更是一个偏好。从技术上来说,datetime
字段是larger而不是bit
字段,但由于无论如何您都需要存储它,所以它并不重要。然而,性能明智,你可以索引或获得相同的结果。我个人认为bit
字段是多余的,并使用空值datetime
。
很酷,感谢您的建议 – 2012-04-11 15:55:01
如果您前一段时间添加了'DeletedBy'位,并且已经在您的实时数据库中记录了'已删除',那么您需要保留位域,因为您没有要输入的信息在这个阶段'删除'(我想象)。
不,它还在测试中,并且表格是在前一天创建的,所以我想我可以擦掉那一列 – 2012-04-11 15:58:59
你确实需要知道谁删除了,所以DeletedBy列必须留在那里。这就产生了主要问题:你应该保留位列吗?
答案很简单:没有:) 我知道它只是一个比特列,它并不占用太多,但有很多行乘以很多位。它当然可能不会影响你的存储,但在这种情况下没有理由保留冗余数据。关于你可能有,只是更新DeletedBy成类似“系统”或东西,告诉你该纪录是在新的领域的实施
很酷,看起来共识是删除该字段,谢谢 – 2012-04-11 16:02:33
你基本上创建之前被删除的删除= 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
对于大规模的表我真的不喜欢使用软删除,我更喜欢归档,但我明白所有的项目是不同的。
,我可能只是继续主表中的“DeletedBy”标志,因为它少一点的开销,并创建“DeletedBy”和“时间戳”一DeletionLog表审核
这将是一个特别有益高阅读环境。
试一试,让我们知道。添加几百万个虚拟记录并运行查询。 – asawyer 2012-04-11 15:46:48
我想我的老板会杀了我,如果我添加了几百万行到工作数据库,但我想我可以在我的家庭盒子上安装一个SQL服务器试用版,并让它去那里 – 2012-04-11 15:47:38
@MikeyMouse:难道你没有测试环境? :) – 2012-04-11 15:47:58