@ accid2が@accidと等しくない場合、比較を実行したい場合は、アクションをロールバックし、そうでない場合はinsertを実行します。else expressionがうまく動作しない場合
このトリガーの結果は、一致していなくても、私のテーブルに挿入されます。ここ
は私のコードです:
ALTER TRIGGER [dbo].[TG_checkacctypehtl]
ON [dbo].[Accommodation_Hotel] INSTEAD OF INSERT
AS
DECLARE @accid NVARCHAR(50), @accid2 NVARCHAR(50),@hid NVARCHAR(50),@fsp NVARCHAR(50), @fc NVARCHAR(50), @sr NVARCHAR(50);
SELECT @hid = i.hotel_id FROM INSERTED i;
SELECT @fsp = i.facillities_swimming_pool FROM INSERTED i;
SELECT @fc = i.facillities_catering FROM INSERTED i;
SELECT @sr = i.star_rating FROM INSERTED i;
SELECT @accid2 = i.accommodation_id FROM INSERTED i;
SELECT @accid = accommodation_id FROM [dbo].[Accommodation] WHERE accommodation_type= 'hotel' AND [email protected];
BEGIN
BEGIN TRAN
SET NOCOUNT ON
PRINT @accid2
PRINT @accid
IF(@accid2 != @accid)
BEGIN
RAISERROR('Record Not Inserted, Accommodation ID is not a Hotel Id',16,1); ROLLBACK; END
ElSE BEGIN
INSERT INTO [dbo].[accommodation_hotel] (hotel_id,facillities_swimming_pool,facillities_catering,star_rating,accommodation_id)
VALUES (@hid,@fsp,@fc,@sr,@accid2);COMMIT;
END
END
*プリントは、チェックのために私が取得値です。
私のロジックエラーまたは私の構文エラーですか?
以外にも、トリガー内でコミットまたはロールバックを実行することは一般的には悪い考えです。 – sstan
'@ accid2'と' @ accid'の値は何ですか? – sstan
あなたのトリガーには**メジャー**の欠陥があります。**行ごとに一度**呼び出されると仮定しているように思われます。**これは**ケースではありません。トリガは**文ごとに** **起動します。したがって、このトリガを起動させる 'INSERT'文が25行挿入された場合、トリガは一度**発生しますが、' Inserted'擬似テーブルは25行あります。あなたのコードがここで選択する25行のうちどれですか? 'SELECT @id = u.id FROM Inserted u' - これは非決定論的なもので、**任意の行**を取得し、**すべての行を無視します**。これを考慮に入れてトリガーを書き直す必要があります。 –