Académique Documents
Professionnel Documents
Culture Documents
Trigger Instead Of
Es un tipo de trigger, que asociado a una vista, cuando se intenta realizar el tipo de consulta
que indica el trigger (insertar, modificar, o eliminar), una vez están los registros en las tablas
inserted o deleted, la consulta se interrumpe y salta el trigger, con lo que podemos manejar
los datos que hay en estas tablas temporales mediante el trigger, esto es muy práctico cuando
queremos insertar en varias tablas pertenecientes a una vista, ya que con una simple consulta
no podremos, tendremos que trabajar con un trigger Instead Of y usar las filas incluidas en
la tabla inserted.
Sintaxis:
Tenemos una vista que hace referencia a Departamentos y empleados, y contiene el nº del
departamento y nombre de la tabla departamentos y el nombre y apellidos de la tabla
empleados. Si intentamos hacer un insert sobre la vista, sin el trigger dará error y no dejará
insertarlo, pero en cambio, con el triger: Cuando hagamos la inserción salta el trigger.
Mediante el trigger, accedemos a la tabla inserted, e insertamos los valores necesarios en la
tabla departamentos y empleados.
Ejemplo 1:
Para ver un trigger de una vista mediante el explorador de objetos, seguir la siguiente ruta:
BASE DE DATOS > VISTAS > [Nombre Vista] > Triggers > [Nombre Trigger].
Ejemplo2:
La idea es que al insertar sobre la vista el siguiente registro se grabe los datos en la table
Emp:
insert into VistaEmpDept (Emp_no, Apellido, Oficio, Dnombre) Values
('8888','Angulo','Vendedor','Investigación')
(1 fila afectada)
Si cumplo los requisitos que yo he puesto en el trigger sobre la vista, me permitirá insertar
el empleado.
insert into VistaEmpDept (Emp_no, Apellido, Oficio, Dnombre)
Values (8888,'ANGULO','VENDEDOR','Investigación')
(1 fila afectada)
(1 fila afectada)
Otro Ejemplo :
Create Trigger Inserta_Empleado
On Emp
Instead Of Insert
As
declare @dir int
declare @emp_no int
declare @oficio nvarchar(30)
select @dir = inserted.dir from inserted
select @emp_no = emp_no, @oficio = oficio from emp
where emp_no = @dir
if @emp_no is null
begin
print 'Fallo, no se ha realizado la inserción'
print 'El empleado insertado no tiene director adecuado'
end
else
begin
if @oficio = 'DIRECTOR' OR @OFICIO = 'PRESIDENTE'
BEGIN
insert into emp
select * from inserted
END
ELSE
BEGIN
print 'Fallo, no se ha realizado la inserción'
print 'El dir no es director'
END
end
Return