T-SQL Déclencheur d'Insertion pour insérer,mettre à jour sur si la condition sur plusieurs tables
Je vais avoir quelques problèmes en essayant de résoudre un Déclencheur SQL pour définir automatiquement un utilisateur bloqué & créer le bloc d'enregistrement, y compris la date dans un autre tableau, si la date d'Échéance est égale à une date fixée.
Le problème est que lorsque la gâchette est actionnée par un insert, l'impression de l'exécution des instructions et de l'insertion se produit, mais l'insertion dans la table n'est pas, ou l'instruction de mise à jour ? Quelqu'un peut-il expliquer pourquoi ?
Remarque: à la Fois l'insertion et de l'instruction de mise à Jour sont très bien lorsqu'il est exécuté par eux-mêmes.
TABLE COMPTE
CREATE TABLE [dbo].[Account](
[AccountNo] [int] IDENTITY(1,1) NOT NULL,
[CustomerNo] [int] NOT NULL,
[PaymentNo] [int] NULL,
[CreditNo] [int] NULL,
[BlockID] [dbo].[number] NULL,
[Balence] [dbo].[currency] NOT NULL,
[AmountDue] [dbo].[currency] NOT NULL,
[DueDate] [dbo].[dates] NULL,
[AutherisedBy] [nvarchar](50) NOT NULL,
[DateCreated] [date] NOT NULL,
BLOCKEDUSER TABLE
CREATE TABLE [dbo].[BlockedUsers](
[BlockID] [int] IDENTITY(1,1) NOT NULL,
[DateEnforced] [dbo].[dates] NOT NULL,
[Blocked] [dbo].[switch] NOT NULL,
DÉCLENCHER
ALTER TRIGGER [dbo].[Add_Blocked_User]
ON [dbo].[Account]
FOR INSERT
AS
BEGIN
SET NOCOUNT ON;
Declare @ID int
Select @ID = [AccountNo] from inserted
If(Select [DueDate] from inserted) = '2011-01-01'
INSERT INTO dbo.BlockedUsers(DateEnforced,Blocked)
VALUES (GETDATE(),1)
PRINT 'New Block Date Added'
UPDATE Account
Set BlockID = IDENT_CURRENT('BlockID')
where @ID = @ID
PRINT 'Account Blocked'
END
GO
Pleinement de Travail Exemple : Réalisé à l'aide de l'Aide ci-Dessous.
ALTER TRIGGER [dbo].[Add_Blocked_User]
ON [dbo].[Account]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
Declare @ID int
Select @ID = [AccountNo] from inserted
If(Select [DueDate] from inserted)Not Between (select CONVERT(date, getdate() - 30)) And (select CONVERT(date, getdate()))
Begin
INSERT INTO dbo.BlockedUsers(DateEnforced,Blocked)
VALUES (GETDATE(),1)
PRINT 'New Block Date Added'
UPDATE Account
Set BlockID = (Select Max(BlockID) From BlockedUsers)
where [AccountNo] = (Select [AccountNo] from inserted)
PRINT 'Account Blocked'
End
END
GO
OriginalL'auteur Baggerz | 2012-12-15
Vous devez vous connecter pour publier un commentaire.
La
IF
instruction Transact-SQL prévoit qu'une seule déclaration après que la condition:Si vous souhaitez effectuer plus d'une instruction dans la même branche, vous devez les placer dans le
BEGIN
/END
"supports":Dans votre déclencheur, seule l'instruction INSERT exécute selon le résultat de la
(Select [DueDate] from inserted) = '2011-01-01'
condition. Comme pour les deux Estampes et de la mise à JOUR, ils exécutent sans condition, c'est à dire après chaque insérer dansAccount
. Donc, vous avez probablement besoin d'ajouterBEGIN
etEND
autour d'INSERTION, de mise à JOUR et les deux Tirages:OriginalL'auteur Andriy M
Vous n'avez
Vous souhaitez utiliser
POUR INSÉRER raconte Sql Server que votre détente entièrement remplacer le normal de l'opération d'insertion. APRÈS avoir INSÉRER raconte Sql Server pour aller de l'avant et insérez la ligne, et ensuite exécuter ce code comme un post-traitement de l'étape.
FOR INSERT
etAFTER INSERT
la même signification dans les instructions Transact-SQL. Il estINSTEAD OF INSERT
qui remplace le fonctionnement réel.Merci Andy, Cela m'a aidé à obtenir à la fois la mise à jour et l'insérer correctement. Vraiment apprécié.
Désolé 🙁 je ne l'utilise jamais. C'était le fait que la mise à jour de compte n'a rien qui m'a fait penser à elle comme agissant en qualité de au lieu de.
Vous devez mettre à jour votre réponse afin de refléter @AndriyM de réponse.
Pourquoi? Parce que c'est à tort, d'encombrer l'espace et de perdre d'autres. Ajoutez à cela: si vous n'obtenez pas le bas-voix. D'autres la lecture de votre réponse besoin de lire tous les commentaires, juste pour trouver que c'est mauvais. Je vais pas voter pour le moment, mais je suggère la suppression de votre réponse car elle n'est pas récupérable, avant de commencer à descendre les votes.
OriginalL'auteur Brian White