2009-09-15 25 views
1

我们有一个数据库,其中联系人只是软删除,即我们设置了一个名字删除为真。这个API处理这个问题,但有时你需要直接对数据库运行查询,并且很容易忘记这一点,并导出实际删除的联系人。这不是一个大问题,因为我已经习惯了系统,但是如果我正在度假,或者如果有其他人要接管,我想确保这些行不会被返回 - 除非特别要求。这给我们留下了以下两个问题:你能告诉SQL Server不要返回特定的行吗?

  1. 有没有办法告诉(在这种情况下,2005年)的SQL Server例如,如果一个位被设置为true,不返回行?

  2. 如果是这样,如果特别要求(如果bit ='true'),这些行仍可以被检索吗?

回答

5

我可以看到自动为你做的唯一方法是创建相关表的视图,明确排除删除的行。然后在需要查看已删除的数据时使用真正的表格。

+0

我会建议相同的。如果可行,创建一个视图。这也消除了应用程序的责任来过滤掉已删除的记录。 – Pete 2009-09-15 08:08:24

+0

不幸的是,在这一点上我不认为这是一种选择 - 我有一种感觉,这应该早在设计阶段就已经完成了。但这对未来的项目很有用。 – 2009-09-15 08:12:48

+0

那么如果你还在开发中,你可以考虑将所有包含已删除行的表重新命名为tablename_base或类似的东西。这可以很好地工作,不需要更改代码。这显然需要一些测试。 – 2009-09-15 08:16:57

8

为了选择非删除的行或删除的文件,创建两个观点:

CREATE VIEW ActiveContacts 
AS 
    SELECT (list of fields) 
    FROM dbo.Contacts 
    WHERE deleted = 0 

CREATE VIEW DeletedContacts 
AS 
    SELECT (list of fields) 
    FROM dbo.Contacts 
    WHERE deleted = 1 

现在,您可以轻松地只需从积极或删除的联系人挑:

SELECT (list of fields) 
FROM ActiveContacts 

SELECT (list of fields) 
FROM DeletedContacts 

这样的话,你可以很容易地封装了选择标准,如果你不回你的观点,“删除”标志,外部用户甚至不会看到塔t旗,并不会知道它在那里。

马克

+1

我想他是在谈论一种查询数据库的方式,而不需要指定where子句。如您所提及的最佳选择是使用视图。 – 2009-09-15 07:13:04

+0

是的,我的意思是Tannick说的。也许我对此有点不清楚。 – 2009-09-15 08:11:13

+0

@Yannick M.,你在说什么?如果你只是_ASELECT *从ActiveContacts_(使用视图@marc_s显示你如何创建),你只会得到“活动”的联系人,没有必要的地方 – 2009-09-15 13:27:26

1

您可以创建一个隐藏的那些行,如果你需要直接行,你仍然可以去表的视图。尝试创建视图vwBlah AS SELECT表,列,去,在这里从表名,WHERE标志= 0.

相关问题