Mostrando entradas con la etiqueta trigger. Mostrar todas las entradas
Mostrando entradas con la etiqueta trigger. Mostrar todas las entradas

martes, 2 de marzo de 2010

Cómo saber si es Insert o Update Trigger AFTER INSERT,UPDATE - SQL SERVER

Se tien dos tablas:Empleado y Empleado_Log, se quiere que cada vez que se haga un cambio o una nueva inserción de registro en la tabla Empleado se guarde el nuevo registro o el modificado en la tabla Empleado_Log se debe especificar si fue un insert o un update en una de las columnas, la cual en este ejemplo se llama: "accion".

Ejemplo:


--TABLAS:
create table Empleado(
id int not null,
nombre varchar(20),
apellido varchar(20),
edad int,
editable varchar(2)
)
--tabla log
create table Empleado_Log(
idEmpleado int,
nombre varchar(20),
apellido varchar(20),
edad int,
editable varchar(2),
accion varchar(20)
)

--trigger que se disparará cuando se haga un insert o un update
create trigger trg_Example
on Empleado
after insert,update
as
begin
declare
@idEmp int,
@nombre varchar(20),
@apellido varchar(20),
@edad int,
@editable varchar(2),
@accion varchar (20)

select @idEmp=id,@nombre=nombre,@apellido=apellido,@edad=edad,
@editable=editable
from inserted
begin
--Si hay valores en la tabla deleted y además todos(excepto
--editable y id) son diferentes a los nuevos valores insertados,
--significa que ha habido un update
if exists(select * from deleted d join inserted i on
d.id=i.id where d.nombre != i.nombre or
d.apellido != i.apellido or d.edad != i.edad)
begin
set @accion ='record updated'
insert into Empleado_Log values(@idEmp,@nombre,@apellido,
@edad,@editable,@accion)
end
--Si no ha habido un update hay valores sólo en la tabla inserted
--y eso significa que ha habido un insert.No se debe olvidar
--que un update es un delete y un insert.
else if exists(select id from inserted)
and not exists(select id from deleted)
begin
set @accion ='record inserted'
insert into Empleado_Log values(@idEmp,@nombre,@apellido,
@edad,@editable,@accion)
end
end
end

--probando
insert into Empleado values (1,'pedro','sanchez',30,'si')

insert into Empleado values (2,'Luis','Perez',32,'no')

update Empleado set nombre='josse',apellido='diaz',
edad=21,editable='si' where id=1

update Empleado set nombre='Juan' where id=2

delete from Empleado_Log

select * from Empleado_Log

--borrando tablas y trigger
drop table Empleado_Log
drop table Empleado
drop trigger trg_Example

miércoles, 3 de febrero de 2010

Trigger After Insert Update - SQL SERVER




/*Creo la Tabla Empleado*/

create table Empleado(
nombre varchar(20),
apellido varchar(20))


/*En esta se guardará automaticamente lo que se guardo en
la Tabla Empleado*/

create table Empleado_Log(
nombre varchar(20),
apellido varchar(20),
direccion varchar(100),
edad int)


/*Creo Trigger, se ejecutará después de insertar o actualizar la
tabla Empleado e insertará los neuvos datos insertados en Empleado
en la tabla Empleado_Log*/

Create trigger trg_Empleado_Log
on Empleado
after insert,update
as
BEGIN

set nocount on;

declare
@nombre varchar(20),
@apellido varchar(20)

select @nombre = nombre,@apellido = apellido
from inserted

declare
@direccion varchar(100),
@edad int

set @direccion='Av 15, Santa Marina'
set @edad = 22

begin
insert into Empleado_Log values(@nombre,@apellido,@direccion,@edad )
end
END



/*Probando*/

insert into Empleado values('Pedro','Casas')
select * from Empleado
select * from Empleado_Log

update Empleado set nombre = 'Carlos'
select * from Empleado
select * from Empleado_Log

sábado, 16 de enero de 2010

Oracle - Trigger y algunas cosas básicas

No es case sensitive.
No existe el: on update cascade.
Para crear una tabla:

create table Producto(
id number not null constraint d_pk primary key,
precio number,
stock number);

/*otra tabla*/
create table Pedidos(
idprod number not null,
unidades number,
foreign key (idprod) references producto(id));


Insertando a las tablas:

/*insertando a la tabla producto*/
insert into Producto values(1,350,10);

/*insertando a la tabla pedidos*/
insert into Pedidos values(1,8);


Haciendo Select en las tablas:

select * from Pedidos order by idprod asc;
select * from Producto order by id asc;
/*Esta última consulta nos mostrará el valor '10' en el campo 'stock' aún cuando ya
se ha hecho el pedido de '8' productos.*/


Lo ideal sería que cuando se hagan pedidos el numero de estos sea restado al campo 'stock' de la tabla Producto.

En ese caso podemos crear un trigger en el que especificaremos que cada vez que se haga un 'insert', un 'update' o un 'delete', el valor en el campo 'stock' de la tabla Poducto se actualize.

Creando el trigger 'calculastock':

create o replace trigger calculastock
after insert or delete or update
on Pedidos
for each row
begin
if(inserting or updating)
then
update Producto
set stock = stock - :new.unidades
where Producto.id = :new.idprod;
end if;
if(updating or deleting)
then
update Producto
set stock = stock + :old.unidades
where Producto.id = :old.idprod;
end if;
end;


Las variables 'old' y 'new' no necesitan declararse, son tipo tipo %ROWTYPE , y contienen una copia del registro 'antes'(old) y 'después'(new) de la acción sql(insert, update,delete).