是否可以对SQL Server中的表应用默认筛选器?

是否可以对SQL Server中的表应用默认筛选器?,sql,sql-server,tsql,Sql,Sql Server,Tsql,例如,我有一个名为users的表,它有3列sid、Name和IsDeleted,IsDeleted表示用户是否被删除 当我在下面的select语句select*from users中运行时,是否可以自动筛选出已删除等于1的记录?我有一个只设计为软删除的数据库,所以有很多表都有这个IsDeleted列。在查询数据库时,我们必须添加where子句来过滤这些记录,这非常烦人,尤其是在查询/连接多个表时。我想在这里问一下,是否有一些类似默认过滤器的特性?这样做。因此,只有禁用表默认过滤器时,才能查询已删

例如,我有一个名为users的表,它有3列sid、Name和IsDeleted,IsDeleted表示用户是否被删除


当我在下面的select语句select*from users中运行时,是否可以自动筛选出已删除等于1的记录?我有一个只设计为软删除的数据库,所以有很多表都有这个IsDeleted列。在查询数据库时,我们必须添加where子句来过滤这些记录,这非常烦人,尤其是在查询/连接多个表时。我想在这里问一下,是否有一些类似默认过滤器的特性?这样做。因此,只有禁用表默认过滤器时,才能查询已删除的记录

要做到这一点,一种简洁易懂的方法是使用视图。您可以创建一个视图,通过此标志过滤掉用户并返回所有列

CREATE VIEW v_Users AS
    SELECT * FROM Users WHERE IsDeleted = 0
然后,在所有查询中,都可以使用此视图而不是表

SELECT u.email, u.name, likes.*
FROM v_Users AS u
INNER JOIN likes ON likes.user_id = u.id
完整的fiddle示例:

变体1:您可以使用已删除的记录创建新表,在删除时触发,而不是插入/更新/删除,并使用delete将所有记录移动到新表中。您不必重新映射实际查询。您仍然可以使用外键,并且可以强制引用完整性

CREATE TABLE dbo.r_users (s__row_id int not null identity(1,1), s__dml_dt datetime not null, s__dml_type char(1) not null, col1...)

CREATE TRIGGER dbo.trg_del_users
ON dbo.users
AS
INSERT INTO dbo.r_users select getdate(), 'd', * from dbo.users

DELETE FROM dbo.users WHERE IsDeleted = 1
变量2:您可以在过滤表/TVF/CTE上创建视图


没有您想要的功能,只有脚本。

例如,您可以为这些表创建视图为每个表创建视图。我永远不会使用这样的设计,因为您的数据库不能再使用它的引用完整性,这将导致curruptdata@GuidoG打字错误固定的: