0% encontró este documento útil (0 votos)
270 vistas7 páginas

Tipos de Disparadores

Los triggers son disparadores que se ejecutan automáticamente cuando ocurre una acción DML (insert, update, delete) sobre una tabla. Existen tres tipos principales de triggers: (1) según la acción DML que los dispare (insert, update, delete), (2) según su temporalidad (before, after), y (3) según su nivel de activación (fila, orden). Los triggers permiten afectar múltiples tablas y mantener la integridad referencial.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
270 vistas7 páginas

Tipos de Disparadores

Los triggers son disparadores que se ejecutan automáticamente cuando ocurre una acción DML (insert, update, delete) sobre una tabla. Existen tres tipos principales de triggers: (1) según la acción DML que los dispare (insert, update, delete), (2) según su temporalidad (before, after), y (3) según su nivel de activación (fila, orden). Los triggers permiten afectar múltiples tablas y mantener la integridad referencial.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

DISPARADORES

a) investigar sobre los diferentes tipos de disparadores (triggers)


Tipos de triggers
Los triggers pueden definirse para las operaciones INSERT, DELETE o Update, y
pueden dispararse antes o después de la operación. Finalmente, el nivel de los
disparadores puede ser la fila o registro o la orden.
El modificador BEFORE o AFTER indica que el trigger se ejecutará antes o después de
ejecutarse la sentencia SQL definida por DELETE, INSERT o UPDATE. Si incluimos el
modificador OF el trigger solo se ejecutará cuando la sentencia SQL afecte a los
campos incluidos en la lista.
El alcance de los disparadores puede ser la fila o de orden. El modificador FOR EACH
ROW indica que el trigger se disparará cada vez que se realizan operaciones sobre
cada fila de la tabla. Si
se acompaña del modificador WHEN, se establece una restricción; el trigger solo
actuará, sobre las
filas que satisfagan la restricción.
Tipos de disparadores.
Categoria Valores Comentarios
Orden INSERT, Define que tipo de operación DML provoca la
DELETE, activación del trigger
UPDATE
Temporalización BEFORE o Define si el disparador se activa antes o después de
AFTER que se ejecute la operación DML
Nivel Fila u Los disparadores con nivel de fila se activan una
Orden vez por cada fila afectada por la orden que provocó
el disparo. Los Triggers con nivel de orden se
activan sólo una vez, antes o después de la orden.
Los disparadores con nivel de fila se identifican
por la cláusula FOR EACH ROW en la definición
del disparador.
Orden de ejecución de los triggers
Una misma tabla puede tener varios triggers asociados. En tal caso es necesario
conocer el orden en el que se van a ejecutar.
Los disparadores se activan al ejecutarse la sentencia SQL.
Si existe, se ejecuta el disparador de tipo BEFORE (disparador previo) con nivel de
orden.
Para cada fila a la que afecte la orden:
 Se ejecuta si existe, el disparador de tipo BEFORE con nivel de fila.
 Se ejecuta la propia orden.
 Se ejecuta si existe, el disparador de tipo AFTER (disparador posterior) con
nivel de fila.
 Se ejecuta, si existe, el disparador de tipo AFTER con nivel de orden.
Restricciones de los Triggers.
El cuerpo de un disparador es un bloque PL/SQL. Cualquier orden que sea legal en un
bloque PL/SQL , es legal en el cuerpo de un disparador, con las siguientes
restricciones:
- Un disparador no puede emitir ninguna orden de control de
transacciones ( COMMIT, ROLLBACK o SAVEPOINT). El disparador se activa como
parte de la ejecución de la orden que provocó el disparo, y forma parte de la misma
transacción qu dicha orden. Cuando la orden que provoca la orden es confirmada o
cancelada, se confirma o se cancela también el trabajo realizado por el disparador.
- Por las mismas razones, ningún procedure o función llamado por el disparador
puede emitir órdenes de control de transacciones.
- El disparador no puede declarar variables de tipo LONG.
Utilización de ld y :new en los disparadores con nivel de fila.
Un disparador con nivel de fila se ejecuta una vez por cada fila procesada por la
orden que provoca el disparo. Dentro del disparador, puede accederse a la fila que
está siendo actualmente
procesada utilizando, para ello, dos pseudo-registros,  ld y :new.
En principio tanto  ld como :new son del tipotabla_disparo%ROWTYPE;
Orden de ld :new
Disparo
INSERT No definido; todos los Valores que serán insertados cuando
campos toman se complete la orden
el valor NULL.
UPDATE Valores originales de la Nuevos valores que serán escritos
fila, antes de cuando se complete la orden.
la actualización.
DELETE Valores originales, No definido; todos los campos toman
antes del borrado el valor NULL.
de la fila.

b) implementar ejemplos en su propia BD

create database practica

go
use practica;
go
create table productos
(
id_producto int identity primary key,
codigo_producto varchar(8) not null,
nombre varchar(50) not null,
existencia int not null
)
go
create table historial
(
fecha date,
codigo_producto varchar(8),
descripcion varchar(50),
usuario varchar(50)
)
drop table historial
go

create table ventas


(
codigo_producto varchar(8),
precio money,
cantidad int
)
go
insert into productos values ('A001','Cereales',24);
insert into productos values ('A002','Arroz',14);
insert into productos values ('A003','Azucar',12);
insert into productos values ('A004','Fideos',10);
insert into productos values ('A005','Mazamorra',32);
insert into productos values ('A006','Aceite',20);
insert into productos values ('A007','Avena',18);
insert into productos values ('A008','Gelatina',28);

SELECT *FROM historial


SELECT * FROM productos

truncate table productos

alter trigger productoInsertad


on productos
for insert -----trigger insert
as
set nocount on
declare @codigo_producto varchar(8)
select @codigo_producto= codigo_producto from inserted
insert into historial values(getdate(), @codigo_producto, 'registro insertado', system_user)

go

create trigger productoEliminand


on productos
for delete ----trigger delete
as
set nocount on
declare @codigo_producto varchar(8)
select @codigo_producto= codigo_producto from deleted
insert into historial values(getdate(), @codigo_producto, 'registro eliminado', system_user)

go

delete from productos where codigo_producto = 'A003'

create trigger productoActualizad


on productos
for update ----trigger update // se crean dos tablas temporales
as
set nocount on
declare @codigo_producto varchar(8)
select @codigo_producto= codigo_producto from inserted
insert into historial values(getdate(), @codigo_producto, 'registro actualizado',
system_user)

go

update productos set existencia = 20 where codigo_producto = 'A001'

select * from ventas


select * from productos

c) implementar un trigger que afecte por lo menos dos tablas.

create trigger MD_ventas


on ventas
for insert
as set nocount on
update productos set productos.existencia= productos.existencia - inserted.cantidad from
inserted
inner join productos on productos.codigo_producto = inserted.codigo_producto
go

insert into ventas values('A004', 50, 2)


insert into ventas values('A008', 800, 8)

sp_helptrigger ventas

sp_helptrigger ventas

create table tienda1


(
numero_envios int,
cod_produc varchar(8),
nombre varchar(50),
cantidad int
)
go
create table tienda2
(
numero_envios int,
cod_produc varchar(8),
nombre varchar(50),
cantidad int
)
go
create table tienda3
(
numero_envios int,
cod_produc varchar(8),
nombre varchar(50),
cantidad int
)

select * from tienda1


select * from tienda2
select * from tienda3

alter view tiendas


as
select numero_envios, cod_produc, nombre, cantidad, 'tienda1' as destino from tienda1
union all
select numero_envios, cod_produc, nombre, cantidad, 'tienda2' as destino from tienda2
union all
select numero_envios, cod_produc, nombre, cantidad, 'tienda3' as destino from tienda3

select * from tiendas

alter trigger MD_destinos


on tiendas
instead of insert
as
set nocount on
insert into tienda1
select numero_envios, cod_produc, nombre, cantidad from inserted where destino ='tienda1'
insert into tienda2
select numero_envios, cod_produc, nombre, cantidad from inserted where destino ='tienda2'
insert into tienda3
select numero_envios, cod_produc, nombre, cantidad from inserted where destino ='tienda3'

insert into tiendas values(1, 'A0001', 'cereales', 500, 'tienda1')

select *from tienda1


select *from tienda2
select *from tienda3

insert into tiendas values(2, 'A0001', 'cereales', 500, 'tienda3')


insert into tiendas values(2, 'A0002', 'arroz', 430, 'tienda3')
insert into tiendas values(2, 'A0003', 'azucar', 200, 'tienda3')
insert into tiendas values(2, 'A0004', 'avena', 120, 'tienda3')
insert into tiendas values(2, 'A0005', 'fideos', 100, 'tienda3')
insert into tiendas values(2, 'A0006', 'aceite', 110, 'tienda3')
insert into tiendas values(3, 'A0007', 'mazamorra', 130, 'tienda1')
insert into tiendas values(4, 'A0008', 'gaseosa', 220, 'tienda2')
insert into tiendas values(5, 'A0009', 'cuates', 200, 'tienda3')
insert into tiendas values(6, 'A0010', 'chisitos', 80, 'tienda2')

insert into tiendas values(1, 'A0011', 'galletas', 210, 'tienda2')


insert into tiendas values(7, 'A0012', 'gasosa', 220, 'tienda3')

select * from tiendas

PROCEDIMIENTOS ALMACENADOS

------Tarea sobre consultas sql y programación


---------¿A qué interrogante puede corresponder cada una de las siguientes consultas en la BD
---Northwind?
-- Mejorar la consulta de tal forma que muestre el nombre del producto

select ProductID, sum(Quantity) algo


from [Order Details]
group by ProductID
order by 2 desc
--NO TIENE NOMBRE EL PRODUCTO
---- b) Mejorar la consulta y explique
--select * from orders where customerid ='SAVE'

SELECT CustomerID, COUNT(customerID) as pedidos


from orders
group by customerID
ORDER BY pedidos desc
---Que pasa agregando TOP (1)

----2.- (3pts) En la base de datos AdventureWorks. (explicar el proceso en cada caso)


----a) Realizar una consulta que muestre los 3 productos más vendidos

----AdventureWorks
select top 3 pp.ProductID, pp.Name, count(ss.ProductID) as veces_vendido
from Production.Product pp
inner join Sales.SalesOrderDetail ss
on pp.ProductID = ss.ProductID
group by ss.ProductID, pp.Name, pp.ProductID
order by count(ss.ProductID) desc;
------Northwind
SELECT TOP 3ProductName,SUM(Quantity)
FROM [Order Details] AS D
INNER JOIN Products AS P
ON D.ProductID=P.ProductID
GROUP BY ProductName
ORDER BY SUM(Quantity)

---b) ¿Cuál año fue el mejor para las ventas?


select top 1 pp.productID, pp.anio

-----Mostrar la lista de empleados con sus respectivos salarios (40 horas por semana)
---Indicar el listado de los empleados del sexo masculino y que son solteros
select * from HumanResources.Employee
where Gender = 'M' and MaritalStatus = 'S';

También podría gustarte