trigger - SQL Server 2008-Ayuda a escribir el activador INSERT simple
trigger sql server update (3)
Desea aprovechar la tabla lógica insertada que está disponible en el contexto de un activador. Coincide con el esquema de la tabla que se está insertando e incluye las filas que se insertarán (en un activador de actualización, tiene acceso a las tablas lógicas insertadas y eliminadas que representan los datos nuevos y originales respectivamente).
Por lo tanto, para insertar pares de empleado / departamento que no existen actualmente, puede intentar algo como lo siguiente.
CREATE TRIGGER trig_Update_Employee
ON [EmployeeResult]
FOR INSERT
AS
Begin
Insert into Employee (Name, Department)
Select Distinct i.Name, i.Department
from Inserted i
Left Join Employee e
on i.Name = e.Name and i.Department = e.Department
where e.Name is null
End
Esto es con Microsoft SQL Server 2008.
Tengo 2 tablas, Employee and EmployeeResult y estoy tratando de escribir un activador INSERT simple en EmployeeResult que hace esto, cada vez que se hace un INSERT en EmployeeResult como:
(Jack, 200, Ventas) (Jane, 300, Marketing) (John, 400, Ingeniería)
Debería buscar el nombre, pares de entrada del Departamento, como
(Jack, Ventas), (Jane, Marketing), (John, Ingeniería)
dentro de la tabla Empleado, y si tal empleado no existe, debe insertarlo en la tabla Empleado.
Lo que tengo es esto con incógnitas sobre cómo arreglar el "???" s:
CREATE TRIGGER trig_Update_Employee
ON [EmployeeResult]
FOR INSERT
AS
IF EXISTS (SELECT COUNT(*) FROM Employee WHERE ???)
BEGIN
INSERT INTO [Employee] (Name, Department) VALUES (???, ???)
END
Por favor ayuda, gracias de antemano
Esquema:
Employee
--------
Name, varchar(50)
Department, varchar (50)
EmployeeResult
--------------
Name, varchar(50)
Salary, int
Department, varchar (50)
cmsjr tenía la solución correcta. Solo quería señalar un par de cosas para su futuro desarrollo desencadenante. Si está utilizando la declaración de valores en una inserción en un activador, existe una gran posibilidad de que esté haciendo algo incorrecto. Los disparadores se activan una vez por cada lote de registros insertados, eliminados o actualizados. Entonces, si se insertaron diez registros en un lote, entonces el disparador se dispara una vez. Si se está refiriendo a los datos en la inserción o eliminación y está utilizando variables y la cláusula de valores, solo obtendrá los datos para uno de esos registros. Esto causa problemas de integridad de los datos. Puede solucionar esto utilizando una inserción basada en un conjunto como cmsjr muestra arriba o usando un cursor. Nunca elijas la ruta del cursor. Un cursor en un disparador es un problema que espera que suceda, ya que son lentos y pueden bloquear su mesa durante horas. Quité un cursor de un disparador una vez y mejoré un proceso de importación de 40 minutos a 45 segundos.
Es posible que piense que nadie va a agregar varios registros, pero esto ocurre con más frecuencia de lo que la mayoría de las personas que no pertenecen a la base de datos se dan cuenta. No escriba un desencadenante que no funcione en todas las condiciones posibles de inserción, actualización y eliminación. Nadie va a usar el método de un registro a la vez cuando tienen que importar 1,000,000 de registros de objetivos de ventas de un cliente nuevo o actualizar todos los precios en un 10% o eliminar todos los registros de un proveedor cuyos productos ya no vende.
revisa este código:
CREATE TRIGGER trig_Update_Employee ON [EmployeeResult] FOR INSERT AS Begin
Insert into Employee (Name, Department)
Select Distinct i.Name, i.Department
from Inserted i
Left Join Employee e on i.Name = e.Name and i.Department = e.Department
where e.Name is null
End