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