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

时间:2016-12-30 09:05:02

标签: sql sql-server tsql

我有一个名为Users(例如)的表,它有3列(Id,Name和IsDeleted),IsDeleted表示用户被删除了吗?

当我在select语句(从用户中选择*)下面运行时,是否可以自动过滤掉IsDeleted等于1的记录?我有一个只设计为软删除的数据库,所以有这个IsDeleted列的许多表。当查询数据库时,我们必须添加where子句来过滤这些记录,这非常烦人,特别是在查询/连接多个表时。我想问一下,是否有一些功能(如默认过滤器?)来做到这一点。因此,只有在禁用表默认过滤器时才能查询已删除的记录。

2 个答案:

答案 0 :(得分:3)

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

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

完整示例小提琴:http://rextester.com/QDN58706

答案 1 :(得分:0)

变体1:您可以创建包含已删除记录的新表,删除时触发(或代替插入/更新/删除),并使用删除将所有记录移动到新表中。您不必重新映射实际查询。你可以拥有外键,你可以强制参考完整性。

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上创建视图。

没有你想要的,只有脚本。