2016-08-30 5 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 

私はトリガーでこれを行うことが最も効率的な/最も簡単な方法だと思います。私は間違っているかもしれませんが。

トリガーの代わりに、ランクが変更されたときにフロントエンドコードを使用して各行の更新を実行する一時的なソリューションを作成しました。

トリガーがこれを行う方法や方法を知っていれば、この情報を共有してください。

EDIT:追加されたシナリオ 挿入されるランクは、常に割り当てられた数になります。挿入されているものと同じかそれ以上のものはすべて増えます。

トリガーの原因となるランクは、常にその番号を要求する優先順位を持ちますが、それ以外のものはランクを上げて対応します。

ランクが最も高い数値の場合、トリガーはその数値が最大値の+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

トリガ内の複数のレコードを処理するためのカーソル(パフォーマンス不良)は必要ありません。たとえば、以前のMAX IDにROW_NUMBER関数が追加されたデータセットを作成し、それらをすべて一度に挿入することができます。手動でランクを入力するというこのコンセプトは理にかなっていますが、カーソルを使用しないでください。 – btberry

関連する問題