web-dev-qa-db-fra.com

Déclencher pour empêcher la mise à jour lorsque la valeur de l'indicateur est 1

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
3
Przemyslaw Wojda
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).

7
Paul White 9

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.
2
SqlWorldWide