2015-01-25 1 views
2

나는 한 달과 두 개의 분리 된 열을 사용하는 약간의 코드를 만들려고합니다. 거기에서 나는 그 숫자가 이미 통과했는지 알기를 원합니다. 트랜잭션이 성공하면 오류를 전달하여 트랜잭션을 중지하십시오. 그렇지 않으면 계속해서 테이블에 새로운 정보를 삽입하고 싶습니다. 나는이 일을 끝내기 가깝다는 것을 안다. 그러나 나는 기상 레이서를 데려 오는 것 같다. 나는 이것이 내가 꽤 새로운 것에 대한 사실과 관련이있다라고 확신한다. 그리고 나는 작은 세부 사항을 놓치고있다.RAISERROR 및 ELSE 케이스 문제가있는 트리거

현재 두 달을 변수로 사용하고 다른 두 변수를 적절한 날짜/시간 형식으로 바꾸기 위해 세 번째 변수를 만드는 중입니다. 그런 다음 나는 datediff 함수를 사용하여 그 방법을 통과했는지 알아 봅니다. 그래도 아무 소용이. 카드 날짜가 오래된 경우에도 계속 삽입 기능을 계속 사용합니다.

CREATE TRIGGER BadCreditCardDate 
ON Sales.CreditCard 
INSTEAD OF INSERT 
AS 
BEGIN 
    IF EXISTS (
     SELECT 1 
     FROM inserted 
     WHERE (YEAR(GETDATE()) > ExpYear) OR (YEAR(GETDATE()) = ExpYear AND MONTH(GETDATE()) > ExpMonth) 
    ) 
    BEGIN 
     RAISERROR ('The Credit Card you have entered has expired.' ,10,1) 
     ROLLBACK TRANSACTION 
    END 
    ELSE  
     BEGIN 
     INSERT INTO CreditCard (CardType, CardNumber, ExpMonth, ExpYear, ModifiedDate) 
     SELECT CardType, CardNumber, ExpMonth, ExpYear, ModifiedDate 
     FROM inserted 
    END  
END 

이런 식으로 효과적으로 에게 CreditCard에 삽입되는 모든 기록을 확인 :

USE AdventureWorks2012 
GO 

CREATE TRIGGER BadCreditCardDate 
ON Sales.CreditCard 
INSTEAD OF INSERT 
AS 
Begin 
DECLARE @ExpMonth tinyint, 
     @ExpYear smallint, 
     @ExpMonthYear datetime 

SELECT @ExpMonth=ExpMonth, 
     @ExpYear=ExpYear, 
     @ExpMonthYear = @ExpYear + '-' + @ExpMonth + '-00' 
FROM INSERTED 
    IF 
    DATEDIFF(MONTH,@ExpMonthYear,GETDATE()) < 0 
    BEGIN 
     RAISERROR ('The Credit Card you have entered has expired.' ,10,1) 
     ROLLBACK TRANSACTION 
    END 

ELSE  
Begin 
    INSERT INTO CreditCard (CardType, CardNumber, ExpMonth, ExpYear, ModifiedDate) 
    Select CardType, CardNumber, ExpMonth, ExpYear, ModifiedDate FROM inserted 
END 
End 
+2

방아쇠가 방아쇠를 당겼습니다 ** 행렬 당 ** 한 번 ** ** ** ** **이 아닌 것으로 간주됩니다. 트리거는 ** 명령문 ** 당 한 번 실행됩니다. 따라서 UPDATE 문이 25 개의 행에 영향을 주면 트리거가 ** 한번 ** 발생하지만 Inserted와 Deleted는 각각 25 개의 행을 포함합니다 . 다음 25 개의 행 중 어느 것이 귀하의 코드에서 선택됩니까? 'SELECT @ExpMonth = ExpMonth FROM Inserted' - 비 결정적입니다. 이것을 고려하려면 트리거를 다시 작성해야합니다! –

+0

만료 날짜가 '00'으로 하드 코딩되어 있습니다. 표현식이 null이 아니면 DATEDIFF가 실패 할 것으로 예상됩니다. –

답변

3

나는 만료를 확인하는 간단한 방법이있다 생각합니다.

+0

이것은 매력처럼 작동했습니다. 나는 어떻게 작동하는지보고이 작은 아름다움을 기억하기 위해이 코드를 살펴 봐야 할 것입니다. – MikeyZ