我有一个名为Users的表(例如),它有3列(Id、Name和IsDeleted),IsDeleted表示该用户是否被删除?
当我运行下面的 select 语句(select * from users)时,是否可以自动过滤掉 IsDeleted 等于 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
完整示例小提琴:http://rextester.com/QDN58706
变体 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 上创建视图。
没有您想要的功能,只有脚本。
您可以尝试应用行级安全性,这将向表添加过滤器。