나는 한 달과 두 개의 분리 된 열을 사용하는 약간의 코드를 만들려고합니다. 거기에서 나는 그 숫자가 이미 통과했는지 알기를 원합니다. 트랜잭션이 성공하면 오류를 전달하여 트랜잭션을 중지하십시오. 그렇지 않으면 계속해서 테이블에 새로운 정보를 삽입하고 싶습니다. 나는이 일을 끝내기 가깝다는 것을 안다. 그러나 나는 기상 레이서를 데려 오는 것 같다. 나는 이것이 내가 꽤 새로운 것에 대한 사실과 관련이있다라고 확신한다. 그리고 나는 작은 세부 사항을 놓치고있다.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
방아쇠가 방아쇠를 당겼습니다 ** 행렬 당 ** 한 번 ** ** ** ** **이 아닌 것으로 간주됩니다. 트리거는 ** 명령문 ** 당 한 번 실행됩니다. 따라서 UPDATE 문이 25 개의 행에 영향을 주면 트리거가 ** 한번 ** 발생하지만 Inserted와 Deleted는 각각 25 개의 행을 포함합니다 . 다음 25 개의 행 중 어느 것이 귀하의 코드에서 선택됩니까? 'SELECT @ExpMonth = ExpMonth FROM Inserted' - 비 결정적입니다. 이것을 고려하려면 트리거를 다시 작성해야합니다! –
만료 날짜가 '00'으로 하드 코딩되어 있습니다. 표현식이 null이 아니면 DATEDIFF가 실패 할 것으로 예상됩니다. –