2016-04-13 22 views
2

がSQL Serverのインデックス付きビューに挿入された後にを作成できますか?SQLサーバーの挿入トリガー後

インデックス付きビューのSQL Serverに挿入後トリガを作成しています。

CREATE TRIGGER t_STUD_FUZZY_CERTIFICATIONS_mv 
ON STUD_FUZZY_CERTIFICATIONS_mv 
AFTER INSERT AS 

BEGIN 

DECLARE 

@count_rec int, 

@new_poor INT, 
@new_average INT, 
@new_excellent INT, 
@new_stud_num VARCHAR(10), 
@new_mem_set INT, 
@new_lname VARCHAR(25), 
@new_fname VARCHAR(25), 
@new_report_date date, 
@new_total_certs INT 


select @new_stud_num=stud_num, @new_mem_set=mem_set, @new_lname=lname, @new_fname=fname, @new_report_date=report_date, @new_total_certs=total_certs from inserted; 


select @count_rec = count (*) from fuzzy_param_trapezoid where MEM_SET = (select mem_set from inserted); 
--dbms_output.put_line(count_rec); 
if(@count_rec = 0) 

begin --if 

--update fuzzy attributes of stud_fuzzy_orders_mv 
SET @new_poor = dbo.FIT.update_certs_poor(@new_stud_num, @new_total_certs, @new_mem_set); 
SET @new_average = dbo.FIT.update_certs_average(@new_stud_num, @new_total_certs, @new_mem_set); 
SET @new_excellent = dbo.FIT.update_certs_excellent(@new_stud_num, @new_total_certs, @new_mem_set); 

INSERT INTO STUD_FUZZY_CERTIFICATIONS values(@new_stud_num, 
@new_mem_set, 
@new_lname, 
@new_fname, 
@new_report_date, 
@new_total_certs, dbo.FIT.update_certs_poor(@new_stud_num, @new_total_certs, @new_mem_set), 
dbo.FIT.update_certs_average(@new_stud_num, @new_total_certs, @new_mem_set), 
dbo.FIT.update_certs_excellent(@new_stud_num, @new_total_certs, @new_mem_set)); 

UPDATE STUD_FUZZY_CERTIFICATIONS_mv set [email protected]_poor, [email protected]_average, [email protected]_excellent where [email protected]_stud_num and [email protected]_mem_set; 

end;--end if 

END; 

GO 

私は以下のエラーに

Msg 8197, Level 16, State 6, Procedure t_STUD_FUZZY_CERTIFICATIONS_mv, Line 1 
The object 'STUD_FUZZY_CERTIFICATIONS_mv' does not exist or is invalid for this operation. 

を取得していますし、私は、唯一の正しいデータベース上STUD_FUZZY_CERTIFICATIONS_mvは、データベース内の既存されているオブジェクトを実行しています。

+0

このトリガーは壊れています。 'inserted'はちょうど1行しか含まないと仮定しています。これは安全な仮定ではありません。 'inserted'には0,1または*複数の行が含まれていて、これを処理するためにトリガーを書くべきです(理想的には、' inserted'を他のテーブルに加えて* set *ベースの変更を作成する)。 –

答えて

0

tableの代わりにViewに対してトリガーを作成していると思います。

ビューに表示されない列にデータを挿入したい場合があります。これを行うには、挿入を処理するビューにINSTEAD OFトリガーを作成します。

CREATE TRIGGER t_STUD_FUZZY_CERTIFICATIONS_mv ON STUD_FUZZY_CERTIFICATIONS_mv 
INSTEAD OF INSERT 
AS 
BEGIN 
    DECLARE @count_rec int,@new_poor INT,@new_average INT,@new_excellent INT,@new_stud_num VARCHAR(10),@new_mem_set INT, 
      @new_lname VARCHAR(25),@new_fname VARCHAR(25),@new_report_date date,@new_total_certs INT 

    SELECT @new_stud_num=stud_num, @new_mem_set=mem_set, @new_lname=lname, @new_fname=fname, @new_report_date=report_date, @new_total_certs=total_certs 
    FROM inserted; 

    SELECT @count_rec = COUNT (*) FROM fuzzy_param_trapezoid WHERE MEM_SET = (SELECT mem_set FROM inserted); 
    --dbms_output.put_line(count_rec); 

    IF(@count_rec = 0) 
    BEGIN --if 
     --update fuzzy attributes of stud_fuzzy_orders_mv 
     SET @new_poor = dbo.FIT.update_certs_poor(@new_stud_num, @new_total_certs, @new_mem_set); 
     SET @new_average = dbo.FIT.update_certs_average(@new_stud_num, @new_total_certs, @new_mem_set); 
     SET @new_excellent = dbo.FIT.update_certs_excellent(@new_stud_num, @new_total_certs, @new_mem_set); 

     INSERT INTO STUD_FUZZY_CERTIFICATIONS values(@new_stud_num,@new_mem_set,@new_lname,@new_fname,@new_report_date, 
       @new_total_certs, dbo.FIT.update_certs_poor(@new_stud_num, @new_total_certs, @new_mem_set), 
       dbo.FIT.update_certs_average(@new_stud_num, @new_total_certs, @new_mem_set), 
       dbo.FIT.update_certs_excellent(@new_stud_num, @new_total_certs, @new_mem_set)); 

     UPDATE STUD_FUZZY_CERTIFICATIONS_mv SET [email protected]_poor, [email protected]_average, [email protected]_excellent 
     WHERE [email protected]_stud_num and [email protected]_mem_set; 

    END; 
END; 
GO 
+0

ありがとうございます。私はあなたにトリガーの後に、代わりに大きな違いを教えてもらえますか? – Narendra

+0

この回答には依然として質問のトリガの最悪の欠陥が含まれています。それは、 'inserted'が正確に1つの行を含むと仮定します。この前提は保証されていません。トリガが呼び出され、トリガー本体にのみ実行されます、 ませinsert文を得ない - インサート挿入後 –

+0

@Vigneshクマール ではなく、挿入トリガーのトリガーが呼び出されると、トリガー本体は を実行されます最初に、そのテーブル/ビューに行われます実行される。 しかし、ここでは、トリガボディが実行される前または後にインデックス付きビューに行を挿入する必要があります。 挿入トリガーの代わりに、これを直接サポートしないので、トリガー本体自体に挿入ステートメントを記述できますか? ここに私の質問は、INSERTEDテーブルはまだ新しい値を運ぶか?もしそうなら、私はそれらをトリガーボディーに使用することができます。 – Narendra

関連する問題