usar update into example como sql-server triggers

sql server - update - Insertar/eliminar/actualizar desencadenante en el servidor SQL



update select sql server 2014 (4)

Estoy de acuerdo con la respuesta de @Vishnu. Me gustaría agregar que si desea usar el usuario de la aplicación en su activador, puede usar "context_info" para pasar la información al activador.

Me pareció muy útil hacer esto a continuación: http://jasondentler.com/blog/2010/01/exploiting-context_info-for-fun-and-audit

Estoy intentando producir un desencadenador de borrado / inserción / actualización todo en uno. Obtengo dos "sintaxis incorrecta cerca de DESPUÉS en el segundo y tercer AFTERS y un error de sintaxis cerca del último FINAL.

CREATE TRIGGER trig_all_dml ON [dbo.file] AFTER UPDATE AS BEGIN UPDATE (excess code) END AFTER INSERT AS BEGIN UPDATE (excess code) END AFTER DELETE AS BEGIN UPDATE (excess code) END GO

Con suerte, esta es suficiente información. Creo que el problema es mi sintaxis pero no puedo encontrar la sintaxis correcta en línea.


Lo que le estoy dando es el código de activación para INSERT, UPDATE y DELETE. Esto funciona bien en Microsoft SQL SERVER 2008 y en adelante la base de datos que estoy usando es Northwind

/* comment section first create a table to keep track of Insert, Delete, Update create table Emp_Audit( EmpID int, Activity varchar(20), DoneBy varchar(50), Date_Time datetime NOT NULL DEFAULT GETDATE() ); select * from Emp_Audit*/ create trigger Employee_trigger on Employees after UPDATE, INSERT, DELETE as declare @EmpID int,@user varchar(20), @activity varchar(20); if exists(SELECT * from inserted) and exists (SELECT * from deleted) begin SET @activity = ''UPDATE''; SET @user = SYSTEM_USER; SELECT @EmpID = EmployeeID from inserted i; INSERT into Emp_Audit(EmpID,Activity, DoneBy) values (@EmpID,@activity,@user); end If exists (Select * from inserted) and not exists(Select * from deleted) begin SET @activity = ''INSERT''; SET @user = SYSTEM_USER; SELECT @EmpID = EmployeeID from inserted i; INSERT into Emp_Audit(EmpID,Activity, DoneBy) values(@EmpID,@activity,@user); end If exists(select * from deleted) and not exists(Select * from inserted) begin SET @activity = ''DELETE''; SET @user = SYSTEM_USER; SELECT @EmpID = EmployeeID from deleted i; INSERT into Emp_Audit(EmpID,Activity, DoneBy) values(@EmpID,@activity,@user); end


Lo uso para todos los estados (actualizar, insertar y eliminar)

CREATE TRIGGER trg_Insert_Test ON [dbo].[MyTable] AFTER UPDATE, INSERT, DELETE AS BEGIN SET NOCOUNT ON; DECLARE @Activity NVARCHAR (50) -- update IF EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted) BEGIN SET @Activity = ''UPDATE'' END -- insert IF EXISTS (SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted) BEGIN SET @Activity = ''INSERT'' END -- delete IF EXISTS (SELECT * FROM deleted) AND NOT EXISTS(SELECT * FROM inserted) BEGIN SET @Activity = ''DELETE'' END -- delete temp table IF OBJECT_ID(''tempdb..#tmpTbl'') IS NOT NULL DROP TABLE #tmpTbl -- get last 1 row SELECT * INTO #tmpTbl FROM (SELECT TOP 1 * FROM (SELECT * FROM inserted UNION SELECT * FROM deleted ) AS A ORDER BY A.Date DESC ) AS T -- try catch BEGIN TRY INSERT INTO MyTable ( [Code] ,[Name] ..... ,[Activity]) SELECT [Code] ,[Name] ,@Activity FROM #tmpTbl END TRY BEGIN CATCH END CATCH -- delete temp table IF OBJECT_ID(''tempdb..#tmpTbl'') IS NOT NULL DROP TABLE #tmpTbl SET NOCOUNT OFF; END


No es posible, por MSDN :

Puede ejecutar el mismo código para varios tipos de activadores, pero la sintaxis no permite múltiples bloques de códigos en un activador:

Activación en una instrucción INSERT, UPDATE o DELETE a una tabla o vista (Activación de DML)

CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH <dml_trigger_option> [ ,...n ] ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ NOT FOR REPLICATION ] AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }