sql update Déclencheur pour ne pas mettre à jour et supprimer des données



update sql (1)

J'ai une table tblDHColl avec les champs ProjectID, HoleID, X, Y, Z et Locked (type de données bit). Je veux créer un déclencheur pour empêcher toute mise à jour ou supprimer pour les trous où Locked = 1 ou "True". Je veux autoriser d'autres mises à jour ou suppressions des données si le champ Verrouillé est 0 ou "faux" pour un trou. Puisque je suis nouveau sur les déclencheurs, merci de me conseiller comment créer un trigger sur tblDHColl.

CREATE TRIGGER [dbo].[TR_utblDHCollRollBack] ON [dbo].[tblDHColl] 
FOR UPDATE, DELETE 
AS 
    IF EXISTS
    (
        SELECT * 
        FROM deleted d 
        INNER JOIN tbldhcoll c ON d.DataSet = c.DataSet AND d.Hole_ID = c.Hole_ID 
        where locked=1
    ) AND EXISTS
    (
        SELECT * 
        FROM inserted i 
        INNER JOIN tbldhcoll c ON i.DataSet = c.DataSet AND i.Hole_ID = c.Hole_ID 
        where locked=1
    ) 
    BEGIN 
        RAISERROR('ERROR: Validated data cannot be modified',16,-1) 
        ROLLBACK TRANSACTION 
        RETURN 
    END 
GO 

ALTER TABLE [dbo].[tblDHColl] ENABLE TRIGGER [TR_utblDHCollRollBack] GO

Cordialement, Dinesh


Si vous souhaitez modifier la logique de suppression ou de mise à jour des enregistrements, vous devez utiliser un déclencheur "au lieu de". Ce sera comme ceci:

CREATE TRIGGER [dbo].[TR_utblDHCollRollBack] ON [dbo].[tblDHColl] 
INSTEAD OF UPDATE, DELETE 
AS 
    IF TRIGGER_NESTLEVEL() > 1 RETURN

    DECLARE @Count  INT
    SELECT @Count = COUNT(*) FROM inserted

    IF @Count > 0 -- This is UPDATE

    BEGIN   

        UPDATE c
        SET
        Field1 = i.Field1,
        Field2 = i.Field2,
        /*
        .
        .
        .
        */
        FieldN = i.FieldN
        FROM deleted d 
        INNER JOIN inserted i ON i.Hole_ID = d.Hole_ID
        INNER JOIN tbldhcoll c ON d.DataSet = c.DataSet AND d.Hole_ID = c.Hole_ID 
        where ISNULL(d.locked, 0) != 1
    END

    ELSE 

    BEGIN   

        DELETE c        
        FROM deleted d 
        INNER JOIN tbldhcoll c ON d.DataSet = c.DataSet AND d.Hole_ID = c.Hole_ID 
        where ISNULL(d.locked, 0) != 1

    END
GO 




triggers