J'ai besoin d'aide avec un déclencheur pour empêcher la mise à jour sur n'importe quelle colonne à l'exception de la colonne Flag (elle peut être mise à jour) lorsque la valeur Flag est 1 dans le tableau ci-dessous:
CREATE TABLE Tmp (Id INT, Type INT, TranDate DATE, Flag INT)
INSERT INTO Tmp VALUES (1, 2, '2017-04-24', 0)
INSERT INTO Tmp VALUES (2, 4, '2017-04-27', 1)
J'ai essayé avec le code ci-dessous mais ne fonctionne pas correctement.
CREATE TRIGGER [dbo].[Prevent_Update_Trigger]
ON [dbo].[Tmp]
FOR UPDATE
AS
SET NOCOUNT ON
IF EXISTS(SELECT NULL FROM dbo.Tmp t JOIN inserted i ON t.Id=i.Id AND t.Flag=1)
BEGIN
RAISERROR('You can not update when Flag value is 1', 16, 1)
ROLLBACK TRAN
SET NOCOUNT OFF
RETURN
END
SET NOCOUNT OFF
CREATE TRIGGER dbo_Tmp_trg_AU
ON dbo.Tmp
AFTER UPDATE
AS
BEGIN
SET ROWCOUNT 0;
SET NOCOUNT ON;
IF EXISTS
(
SELECT NULL
FROM Deleted AS Del
WHERE
-- Originally, flag was 1
Del.Flag = 1
AND NOT EXISTS
(
-- Column(s) aside from Flag have changed
SELECT
Del.[Type],
Del.TranDate
INTERSECT
SELECT
Ins.[Type],
Ins.TranDate
FROM Inserted AS Ins
WHERE
-- Same Id
Ins.Id = Del.Id
)
)
BEGIN
RAISERROR ('You can not update when Flag value is 1', 16, 1);
ROLLBACK TRANSACTION;
RETURN;
END;
END;
Cela suppose que la colonne Id
ne peut pas être mise à jour (par exemple, il s'agit d'une colonne IDENTITY
).
Modifiez votre code en cela et cela fonctionnera. Je l'ai testé.
CREATE TRIGGER [dbo].[Prevent_Update_Trigger]
ON [dbo].[Tmp]
FOR UPDATE
AS
SET NOCOUNT ON
IF EXISTS(SELECT NULL FROM dbo.Tmp t JOIN deleted i ON t.Id=i.Id AND i.Flag=1)
BEGIN
RAISERROR('You can not update when Flag value is 1', 16, 1)
ROLLBACK TRAN
SET NOCOUNT OFF
RETURN
END
SET NOCOUNT OFF
Tester:
UPDATE tmp SET flag=10
WHERE id =2
Message d'erreur:
Msg 50000, Level 16, State 1, Procedure Prevent_Update_Trigger, Line 8 [Batch Start Line 20] You can not update when Flag value is 1 Msg 3609, Level 16, State 1, Line 21 The transaction ended in the trigger. The batch has been aborted.