2016-12-30 22 views
1

我有一個名爲Users(例如)的表,它有3列(Id,Name和IsDeleted),IsDeleted表示用戶被刪除,或不是?是否可以在SQL Server的表上應用默認篩選器?

當我運行select語句(select * from users)時,是否可以自動篩選出IsDeleted等於1的記錄?我有一個只設計爲軟刪除的數據庫,所以這個IsDeleted列有很多表。當查詢數據庫時,我們必須添加where子句來過濾這些記錄,這非常煩人,尤其是在查詢/連接多個表時。我想問這裏,是否有一些功能(如默認過濾器?)來做到這一點。因此,只有在禁用表格默認過濾器時,才能查詢已刪除的記錄。

+3

例如,您可以爲這些表創建視圖 – HoneyBadger

+0

爲每個表創建視圖。我永遠不會使用這樣的設計,因爲你的數據庫不能再使用它的參照完整性,這將及時導致中斷數據 – GuidoG

回答

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

+0

@GuidoG Typo。修正:) – mroach

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。

沒有你想要的東西,只有腳本。

相關問題