2016-08-13 3 views
-1

@ 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 

* 인쇄 체크를 위해 내가 얻는 값입니다

여기 내 코드입니다.

내 논리 오류 또는 구문 오류입니까?

+0

이외에도 일반적으로 트리거 내부에서 커밋 또는 롤백을 수행하는 것은 좋지 않습니다. – sstan

+0

'@ accid2'와'@ accid'의 값은 무엇입니까? – sstan

+0

방아쇠 방아쇠가 ** 주요한 ** 결함은 ** 행당 한 번 ** ** 불리는 것으로 가정합니다 ** - ** 그렇지 않은 경우 **. 트리거는 ** 명령문 ** 당 한 번 실행됩니다. 따라서이 트리거로 인해 발생하는 INSERT 문이 25 개의 행을 삽입하면 ** 한 번 ** 트리거가 발생하지만'Inserted' 의사 테이블은 25 개의 행을 포함합니다. 다음 25 개의 행 중 어느 것이 귀하의 코드에서 선택됩니까? 'SELECT @id = u.id FROM Inserted u' - 비 결정적이므로 ** 임의의 한 행 **을 가져오고 다른 모든 행은 무시합니다 **. 이것을 고려하려면 트리거를 다시 작성해야합니다! –

답변

-1

는 (@ accid2 <> @accid)

+0

시도해보십시오. 같은 코드입니다. accid와 accid2가 같지 않으면 여전히 테이블에 삽입됩니다. –

+0

'! ='는'<>'와 같습니다. – sstan

+1

나쁘다. <>, 결코 알지 못했다! =로 알았습니다. 그것이 잘못이라고 생각했습니다. 많은 사람들과 마찬가지로, 나는 여러 언어를 다루고 그것이 잘못 전달 된 것이라고 생각했습니다. – Aeroradish

1

내가 이런 전체 트리거 뭔가를 다시 할 경우 유효 숙박 시설의 ID로

ALTER TRIGGER [dbo].[TG_checkacctypehtl] 
ON [dbo].[Accommodation_Hotel] 
INSTEAD OF INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 
INSERT INTO [dbo].[accommodation_hotel] (hotel_id,facillities_swimming_pool,facillities_catering,star_rating,accommodation_id) 
SELECT i.hotel_id 
     ,i.facillities_swimming_pool 
     ,i.facillities_catering 
     ,i.star_rating 
     ,i.accommodation_id 
FROM inserted i 
WHERE EXISTS (SELECT 1 
       FROM [dbo].[Accommodation] a 
       WHERE a.accommodation_type= 'hotel' 
       AND a.accommodation_id = i.accommodation_id) 

IF EXISTS (SELECT 1 FROM inserted i 
      WHERE NOT EXISTS (SELECT 1 
           FROM [dbo].[Accommodation] a 
           WHERE a.accommodation_type= 'hotel' 
           AND a.accommodation_id = i.accommodation_id) 
      ) 
    BEGIN 
    RAISERROR('Records with invalid Accommodation ID is not a Hotel Id not inserted',16,1); 
    END 
END 

삽입 행 ...하고 오류가있는 경우를 인상해야 잘못된 호텔 ID가있는 행이 있습니다. 또한 모든 변수가 필요 없습니다.

트리거는 각 트랜잭션이 아니라 각 트랜잭션에 대해 실행됩니다. 코드는 한 번에 테이블에 한 행만 삽입 될 것이라고 가정합니다.

+0

나는 "1"과 "a"가 내부에 무엇을 사용했는지 알 수 있습니까 ?? –

+0

'1'은'EXISTS' 연산자의 무작위 값이고'1'은 아무것도 될 수 없으며'*'또는'NULL'도 괜찮습니다. 'a'는'[dbo]. [Accommodation]'테이블의 별명입니다. –

관련 문제