regla - no hay caracteristicas seleccionadas para actualizarlas sql
¿Cómo puedo hacer un disparo ANTES DE ACTUALIZAR con el servidor sql? (7)
Es cierto que no hay "disparadores anteriores" en MSSQL. Sin embargo, aún podría seguir los cambios que se realizaron en la tabla, utilizando las tablas "insertado" y "eliminado" juntas. Cuando una actualización hace que se dispare el activador, la tabla "insertada" almacena los nuevos valores y la tabla "eliminada" almacena los valores anteriores. Una vez que tenga esta información, podría simular de manera relativamente fácil el comportamiento "antes del disparo".
Estoy usando Sqlserver Express y no puedo hacerlo before updated
activador before updated
. Hay otra forma de hacer eso?
MSSQL no es compatible BEFORE
desencadenadores. Lo más cerca que tienes es en lugar de desencadenantes, pero su comportamiento es diferente al de BEFORE
desencadenadores en MySQL.
Puede obtener más información sobre ellos here , y tener en cuenta que los activadores INSTEAD OF
"Especifican que el desencadenador se ejecuta en lugar de la instrucción SQL desencadenante, anulando así las acciones de las declaraciones desencadenantes". Por lo tanto, es posible que las acciones en la actualización no se lleven a cabo si el desencadenador no se ha escrito / manipulado correctamente. Las acciones en cascada también se ven afectadas.
En su lugar, puede querer utilizar un enfoque diferente de lo que está tratando de lograr.
No puedo estar seguro de si esto se aplicó a SQL Server Express , pero aún puede acceder a los datos "anteriores" incluso si su desencadenante está sucediendo DESPUÉS de la actualización. Necesita leer los datos de la tabla eliminada o insertada que se crea sobre la marcha cuando se cambia la tabla. Esto es esencialmente lo que dice @Stamen, pero aún necesitaba explorar más para entender esa respuesta (¡útil!).
La tabla eliminada almacena copias de las filas afectadas durante las instrucciones DELETE y UPDATE. Durante la ejecución de una instrucción DELETE o UPDATE, las filas se eliminan de la tabla de activación y se transfieren a la tabla eliminada ...
La tabla insertada almacena copias de las filas afectadas durante las instrucciones INSERT y UPDATE. Durante una transacción de inserción o actualización, se agregan nuevas filas tanto a la tabla insertada como a la tabla de activación ...
Entonces puede crear su activador para leer datos de una de esas tablas, por ejemplo
CREATE TRIGGER <TriggerName> ON <TableName>
AFTER UPDATE
AS
BEGIN
INSERT INTO <HistoryTable> ( <columns...>, DateChanged )
SELECT <columns...>, getdate()
FROM deleted;
END;
Mi ejemplo se basa en el que está aquí:
triggers sql-server
Para hacer un BEFORE UPDATE
en SQL Server, utilizo un truco. Hago una actualización falsa del registro ( UPDATE Table SET Field = Field
), de tal forma que obtengo la imagen previa del registro.
Recuerde que cuando usa un activador en su lugar, no compromete el inserto a menos que específicamente lo indique en el activador. En lugar de realmente significa hacer esto en lugar de lo que normalmente hace, por lo que ninguna de las acciones de inserción normales ocurriría.
T-SQL solo admite desencadenadores DESPUÉS e INSTAAD OF, no presenta un desencadenante ANTES, como se encuentra en algunos otros RDBMS.
Creo que querrás usar un disparador INSTEAD OF.
Todos los desencadenantes "normales" en SQL Server son desencadenantes "AFTER ...". No hay desencadenantes "ANTES ...".
Para hacer algo antes de una actualización, revise INSTEAD OF UPDATE Triggers .