trigger registros para inserted eliminar ejemplos ejemplo deleted delete bitacora actualizar sql sql-server triggers

sql - registros - Disparador para no actualizar y borrar datos



trigger sql ejemplos (1)

Tengo una tabla tblDHColl con los campos ProjectID, HoleID, X, Y, Z y Locked (bit datatype). Quiero crear un disparador para evitar cualquier actualización o eliminar los agujeros donde Locked = 1 o ''True''. Quiero permitir cualquier otra actualización o eliminación de los datos si el campo Bloqueado es 0 o ''falso'' para cualquier agujero. Como soy nuevo en los desencadenantes, avísenme cómo crear un activador en 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

Saludos cordiales, Dinesh


Si desea cambiar la lógica de eliminar o actualizar registros, debe usar un desencadenador "en lugar de". Será así:

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