Déclencheur avec une instruction RAISERROR et en cas d'AUTRE problème

Je suis en train de faire un peu de code qui prend en 2 colonnes séparées, un mois et une année. À partir de là j'ai envie de voir si ces chiffres ont déjà passé ou pas. S'ils ont passé, provoquent une erreur à passer et arrêter la transaction. Sinon, je veux continuer et insérer de nouvelles données dans le tableau. Je sais que je suis proche sur l'obtention de ce travail, mais je ne peux pas sembler obtenir l'instruction RAISERROR à feu. Je suis sûr qu'il a à voir avec le fait que je suis assez nouveau à ce sujet et je suis en manque quelques petits détails.

Actuellement, je prends les deux mois en tant que variables, et de le faire une troisième variable à utiliser pour tourner les deux autres dans un format datetime. Puis-je utiliser la fonction datediff pour essayer et voir si elle a réussi de cette façon. En vain cependant. Je reçois la fonction d'insertion, même si la carte date est ancienne.

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
  • Votre détente est MAJEUR faille que vous semblez le supposer serez appelé une fois par ligne - c'est pas le cas. Le déclenchement de l'incendie une fois par l'instruction, donc si votre UPDATE affecte instructions de 25 lignes, vous aurez le déclencheur tiré une fois, mais alors Inserted et Deleted contiennent chacune 25 lignes. Lequel de ces 25 lignes de votre sélection de code ici?? SELECT @ExpMonth = ExpMonth FROM Inserted - il est non-déterministe. Vous avez besoin de réécrire votre déclencheur pour prendre cela en compte!
  • Vous avez codé en dur '00" pour la date d'expiration de la journée. J'attendrais la DATEDIFF à l'échec si l'expression n'est pas nulle.
InformationsquelleAutor MikeyZ | 2015-01-25