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 alorsInserted
etDeleted
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.
Vous devez vous connecter pour publier un commentaire.
Je pense qu'il y a un moyen plus simple de vérifier la date d'expiration:
De cette façon, vous pouvez effectivement vérifier chaque enregistrement pour être inséré dans
CreditCard
.