2016-08-30 55 views
2

我想在SQL Server數據庫中找出觸發器。我是一名暑期項目的學生,所以我不是專業人士,但可以輕鬆學習。TSQL觸發器來保持增量訂單的完整性

這是我的數據庫表的簡化版本排序按等級:

ID作爲主鍵

ID | RANK 
-------------- 
2 | NULL 
1 | 1 
3 | 2 
4 | 3 
7 | 4 

我的目標現在是要插入的能力/刪除/更新等級並保持數據庫中等級的增量順序,而沒有缺少可用職位中的數字並且沒有重複。

/* Insert new row */ 

INSERT INTO TABLE (ID, RANK) VALUES (6, 4) 

/* AFTER INSERT */ 

ID | RANK 
-------------- 
2 | NULL 
1 | 1 
3 | 2 
4 | 3 
6 | 4 <- new 
7 | 5 <- notice how the rank increased to make room for the new row 

我認爲在觸發器中這樣做是最有效/最簡單的方法;雖然我可能是錯的。

除了觸發器,我做了一個臨時解決方案,當任何等級改變時,我使用前端代碼在每一行上運行更新。

如果你知道如何或如果觸發器可以做到這一點,請分享。

編輯:添加方案 被插入的等級將始終採用其分配的編號。所有大於或等於被插入的東西都會增加。

引起觸發的排名將始終優先聲明其編號,而其他所有排名都會增加以適應排名。

如果rank是最高數字,那麼觸發器將確保該數字是最大值的+1。

+0

這會增加。 ID恰好是爲了?如果插入是(2,5)會怎麼樣? – Paparazzi

+1

這會影響你桌子的表現。 –

+0

嘗試使RANK列成爲計算列 –

回答

0

這可能適合你。讓我知道。

DROP TABLE dbo.test 

CREATE TABLE dbo.test (id int, ranke int) 

INSERT INTO test VALUES (2, NULL) 
INSERT INTO test VALUES (1, 1) 
INSERT INTO test VALUES (3, 2) 
INSERT INTO test VALUES (4, 3) 
INSERT INTO test VALUES (7, 4) 

GO 

CREATE TRIGGER t_test 
ON test 
AFTER INSERT 
AS 
UPDATE test set ranke += 1 WHERE ranke >= (select max(ranke) from inserted) and id <> (select max(id) from inserted) 

GO 

INSERT INTO test values (6,4) 
INSERT INTO test values (12,NULL) 

SELECT * FROM test 
+1

我不認爲這將妥善處理'插入'中有多行的情況。 – Blorgbeard

+0

不,絕對不會插入多行。您可以在觸發器中編寫一個遊標:O –

+1

您不需要遊標(性能不佳)來處理觸發器中的多個記錄。例如,您可以創建一個數據集,並將ROW_NUMBER函數添加到以前的MAX ID中,並且可以一次性插入它們。並不是說我認爲手動輸入等級的整個概念是有道理的,但請不要使用遊標。 – btberry