0

私は新しい問題を発見しました: ClassesStudentsの 2 つのテーブルがあります。生徒は[ClassID]列でクラスを参照します。クラスには[Count]という名前の列があり、参照している学生の数を格納しています。学生テーブルの AFTER INSERT,DELETEトリガーを介して更新しようとしています。次のような単純なCALC_COUNTプロシージャを作成しました。


CREATE PROCEDURE [dbo].[CALC_COUNT]
    @classid INT
AS
BEGIN
UPDATE classes SET [Count] = (SELECT COUNT(Id) FROM students WHERE [ClassID] = @classid);
END

RETURN 0

トリガー内で使用します


CREATE TRIGGER [MONITOR_STUDENTS_SCHEMA_TRIGGER]
    ON [dbo].[students]
    AFTER DELETE, INSERT
    AS
    BEGIN
        UPDATE [dbo].[classes] 
        SET studentsschemarev +=1  FROM inserted; 
        CALC_COUNT(SELECT [ClassID] FROM inserted UNION SELECT [ClassID] FROM deleted); 
        UPDATE [dbo].[stats] SET students_schema_rev += 1;
    END

しかし、うまくいきません。トリガーのSELECT文で行ごとにプロシージャを実行する方法が必要だと思いますが、方法がわかりません。

SQL Server 2012 LocalDB、SQL Server 2008 との互換モード。

4

2 に答える 2

1

ストアド プロシージャは必要ありません。

トリガーを次のように更新します

update classes
set 
   count = StudentCount,
   schemarevcount += 1
from
    classes 
        inner join
    (select * from inserted union select * from deleted) students
        on classes.classid=students.classid
        inner join 
    (select classid, count(*) as StudentCount from students group by classid) counts
        on students.classid = counts.classid

update と calc_count の呼び出しの代わりに

英訳は…

  • クラスの更新 (リビジョンとカウントの設定)
  • 学生テーブルでクラスが変更された場所
  • そのクラスは、クラスごとの学生数のセット内にあります
于 2012-08-02T21:00:47.047 に答える
0

トリガーが起動されない主な理由は、トリガーが INSERT と DELETE で発生する UPDATE を実行しているためです。

はい、UPDATE は DELETE と INSERT ですが、フットプリントに配置する必要があります。

AFTER DELETE, INSERT, UPDATE

それ以外の

AFTER DELETE, INSERT

次に、トリガー自体には、insert および deleted と呼ばれる内部概念テーブルのみがあり、これらを組み合わせて更新します。古い部分は削除されたテーブルにあり、新しい部分は挿入されたテーブルにあります。

ところで、なぜレコードごとに実行したいのですか? 完全な結果セットでそれを行うと、はるかに高速になります!

于 2012-08-03T10:01:10.357 に答える