Quiero crear un disparador antes de eliminar. Cuando elimino un registro de una tabla, ese registro debe insertarse en una tabla de historial. ¿Cómo puedo hacer esto en SQL Server?Cómo crear un desencadenador de eliminación anterior en SQL Server?
Respuesta
En esta situación, es probable que sea mejor hacer un activador de "después" regular. Este es el enfoque más común para este tipo de situación.
Algo así como
CREATE TRIGGER TRG_AUD_DEL
ON yourTable
FOR DELETE
AS
INSERT INTO my_audit_table (col1, col2, ...)
SELECT col1, col2...
FROM DELETED
Lo que ocurrirá es, cuando un registro (o registros!) Se eliminan de la tabla, se insertará la fila eliminada en my_audit_table
La tabla DELETED
es una tabla virtual que contiene el registro (s) tal como fueron inmediatamente antes de la eliminación.
Además, tenga en cuenta que el desencadenador se ejecuta como parte de la transacción implícita en la instrucción de eliminación, por lo que si la eliminación falla y retrocede, el desencadenador también se revertirá.
También es posible usar INSTEAD OF DELETE
CREATE TRIGGER dbo.SomeTableYouWhatToDeleteFrom
ON dbo.YourTable
INSTEAD OF DELETE
AS
BEGIN
-- Some code you want to do before delete
DELETE YourTable
FROM DELETED D
INNER JOIN dbo.YourTable T ON T.PK_1 = D.PK_1
END
EN LUGAR DE ELIMINAR no se puede utilizar ya que tengo eliminada la cascada habilitada en la tabla. – user1374263
FWIW, podría cambiar todas las claves externas de eliminación en cascada a claves externas planas y procesar las eliminaciones desde este desencadenador, que dejarían en claro en un solo lugar todo lo que estaba sucediendo como resultado de la eliminación. – Tony
Se podría hacer en los pasos siguientes para digamos que en este ejemplo estoy usando tabla de clientes:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
LAST_UPDATED DATETIME,
PRIMARY KEY (ID)
);
Crear Historia:
CREATE TABLE CUSTOMERS_HIST( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25) , LAST_UPDATED DATETIME, PRIMARY KEY (ID) );
Trigger en la tabla de origen, como a continuación en caso de borrado:
CREATE TRIGGER TRG_CUSTOMERS_DEL ON CUSTOMERS FOR DELETE AS INSERT INTO CUSTOMERS_HIST (ID, NAME, AGE, ADDRESS, LAST_UPDATED) SELECT ID, NAME, AGE, ADDRESS, LAST_UPDATED FROM DELETED
- 1. Crear desencadenador en SQL Server
- 2. ¿Cómo puedo crear un desencadenador deshabilitado en SQL Server 2005?
- 3. Cómo eliminar el desencadenador en SQL Server?
- 4. SQL Server 2005: T-SQL para deshabilitar temporalmente un desencadenador
- 5. ¿Cómo uso la eliminación de cascada con SQL Server?
- 6. ¿Cómo puedo editar los valores de un INSERT en un desencadenador en SQL Server?
- 7. Crear un desencadenador de SQL condicional en SQLite
- 8. Eliminación de columnas en MS SQL Server
- 9. ejecución condicional después de un desencadenador de eliminación en SQLite
- 10. Cómo cancelo una eliminación en SQL
- 11. SQL: eliminación de registros duplicados en SQL Server
- 12. ¿Cómo puedo obtener la definición (cuerpo) de un desencadenador en SQL Server?
- 13. Crear desencadenador PostgreSQL mediante JDBC
- 14. Cómo crear un plan de mantenimiento en SQL Server?
- 15. Cómo crear un tipo de tabla en SQL Server 2005
- 16. Eliminación de tablas temporales globales (## tempTable) en SQL Server
- 17. Eliminación de múltiples nodos en Individual XQuery para SQL Server
- 18. ¿Cómo se obtiene una lista de columnas actualizadas en el desencadenador SQL Server?
- 19. Manejo de múltiples registros en un desencadenador de MS SQL
- 20. Crear datos de prueba en SQL Server
- 21. Crear un nuevo usuario de db en SQL Server 2005
- 22. crear condicionalmente usuario en SQL Server
- 23. ¿Puedo crear un índice "Covering, Spatial" en SQL Server 2008?
- 24. la eliminación de duplicados utilizando partición por SQL Server
- 25. Creación de un desencadenador en Oracle Express
- 26. SQL Server consulta de eliminación que implica dos tablas
- 27. Comentarios SQL sobre Crear tabla en SQL Server 2008
- 28. ¿Cómo obtener la última inserción/actualización/eliminación de fecha y hora en Sql Server 2005?
- 29. SQL Server Tiempo de espera de bloqueo excedido Eliminación de registros en un bucle
- 30. SQL Server selecciona donde datetimeoffset anterior a 1 hora
Gracias por la respuesta, que funciona bien – user1374263
Tomando nota de que para la reversión a trabajar en un error que un bloque try/catch puede ser necesaria dentro de el desencadenante [(ejemplo)] (http://dba.stackexchange.com/questions/57909) posiblemente depende de qué causa el error. – crokusek
Buen punto, pero recuerde que solo se aplica a RAISEERROR. Un error de terminación de sentencia regular (por ejemplo, violación de PK, etc.) dará como resultado que la reversión de la transacción implícita comience fuera del activador. –