Académique Documents
Professionnel Documents
Culture Documents
S ALMACENADOS
Y TRIGGERS
Procedimientos almacenados
Un procedimiento almacenado es un conjunto de sentencias
SQL y de control de flujo
Beneficios de los procedimientos almacenados:
Triggers
Procedimientos extendidos
Interactive Execution
Ventajas en el rendimiento
Un procedimiento almacenado se ejecuta ms rpido que un
batch porque:
El procedimiento almacenado ya ha sido analizado
Ya se han resuelto las referencias a los objetos
referenciados en el procedimiento almacenado
No se necesita construir el rbol de bsqueda, l usa el que
se hace en el momento de compilarlo
No se necesita crear un plan de bsqueda, porque ya el
procedimiento tiene uno
Ejemplo:
create proc proc_update_titles
as
update titles
set price = price * $0.95
where total_sales < 3000
return
Ejemplo:
drop proc proc_update_titles
Ejemplo:
execute proc_update_titles
Variables
Los procedimientos almacenados pueden crear y usar
variables locales
Las variables slo existen mientras exista el procedimiento
Las variables no las puede usar otro proceso
Ejemplo:
create proc proc_update_under_half_titles
as
declare @max_sales int, @half_max real
select @max_sales = max(total_sales)
from titles
select @half_max = @max_sales / 2
select title, total_sales from titles
where total_sales < @half_max
update titles
set price = price * $0.95
where total_sales < @half_max
return
use database
create view
create default
create rule
create procedure
create trigger
Ejemplo:
grant execute
on proc_update_titles
to tjovanka, vturlough, pbrown
Ejecutar el procedimiento:
exec proc_hello
Parmetros de entrada
An input Parmetro is a variable local to a
procedimiento almacenado that can
receive a value from the exec procedure
Sentencia
Ejemplo:
create proc proc_author_info
(@lname varchar(40), @fname varchar(20))
as
-- lists the author and his or her books
select au_lname, au_fname, title
from authors, titles, titleauthor
where au_fname = @fname
and au_lname = @lname
and authors.au_id = titleauthor.au_id
and titles.title_id = titleauthor.title_id
return
Pasar parmetros
Dos mtodos para pasar valores a parmetros:
Paso de parmetros por posicin
Paso de parmetros por nombre
Ejemplo:
exec proc_author_info "Ringer", "Albert"
au_lname
-------Ringer
Ringer
au_fname
-------Albert
Albert
title
-----
Ejemplo:
exec proc_author_info
@lname = "Ringer", @fname = "Albert"
au_lname
-------Ringer
Ringer
au_fname
-------Albert
Albert
title
----Is Anger the Enemy?
Life Without Fear
au_lname
-------White
Green
...
state
----CA
CA
au_fname
-------Johnson
Marjorie
Parmetros de entrada
Crear un procedimiento almacenado que tenga un parmetro de
entrada:
create proc proc_hello_param (@name varchar(30))
as
print "Hello %1!", @name
return
Parmetros de entrada
Ejecutar el procedimiento con y sin un valor para el
parmetro de entrada:
exec proc_hello_def
exec proc_hello_def "<yourname>"
Retorno de valores
A return Parmetro is a variable local to a
procedimiento almacenado that can send
a value to the exec procedure Sentencia
Ejemplo:
create proc proc_new_price
(@title_id char(6),
@new_price money output)
as
select @new_price = price
from titles
where title_id = @title_id
select @new_price = @new_price * $1.15
return
Ejemplo:
declare @my_title char(6), @my_price money
select @my_title = "PC8888"
exec proc_new_price
@my_title, @my_price output
---------23.00
Planes de bsqueda
Un plan de bsqueda es un conjunto ordenado de etapas que se
requieren para acceder los datos, incluyendo informacin sobre:
Si usar o no un ndice
El ndice a usar
El orden en el cual las tablas se deben encadenar
sp_recompile
sp_recompile hace que cada procedimiento
almacenado (y trigger) que utilice la tabla indicada se
recompile la siguiente vez que l se ejecute
Sintaxis:
sp_recompile table_name
Ejemplo:
sp_recompile authors
Trigger
Un trigger es un procedimiento almacenado asociado
con una tabla, el cual se ejecuta automticamente
cuando se modifica un dato de esa tabla
User-Defined
Can It Be
Can It Be
Can It Use
Explicitly
Executed
Parameters?
Called?
Automatically?
Yes
No
Yes
No
Yes
No
Stored
Procedure
Trigger
Definicin de un trigger
Un trigger se define asociado con una tabla para una o
ms sentencias de manipulacin de datos
Un trigger se puede definir para insert, update, o delete o
cualquier combinacin de ellos
Activacin de un trigger
Cuando se modifica un dato en una tabla que tiene
declarado un trigger para esa sentencia, el trigger se
dispara
El trigger se dispara una vez, independientemente del nmero
de filas afectadas
El trigger se dispara aunque no hayan filas afectadas
Llamarse directamente
Usar parmetros
Definirse sobre tablas temporales o vistas
Crear objetos permanentes de base de datos
Crear triggers
Sintaxis simplificada:
Ejemplo:
create trigger trg_i_sales
on sales
for insert
as
if datename (dd,getdate()) = "Sun"
begin
raiserror 40070, "Sales cannot be
processed on Sunday."
rollback trigger
end
Borrar Triggers
Sintaxis simplificada:
drop trigger trigger_name
Ejemplo:
drop trigger trg_i_sales
sp_help trigger_name
sp_helptext trigger_name
Triggers - ejemplo
Crear dos tablas:
select * into myauthors
from pubs2..authors
create table myrecord (
mytime
myrows
)
datetime,
int
Triggers - ejemplo
Ejecutar un delete y ver la tabla myrecords:
delete from myauthors
where state = "CA"
select * from myrecord
Borrados
A delete adds rows to the deleted table
Inserciones
An insert adds rows to the inserted table
Actualizaciones
An update adds rows to both tables
update titles
set total_sales = isnull(total_sales, 0) +
(select sum(qty)
from inserted
where titles.title_id = inserted.title_id)
where title_id in (select title_id from inserted)
update titles
set total_sales = isnull(total_sales, 0) (select sum(qty)
from deleted
where titles.title_id = deleted.title_id)
where title_id in (select title_id from deleted)
return
Triggers y rollbacks
Tres tipos de rollbacks:
Deshacer el trigger
Deshacer el trigger y la sentencia que lo dispar
Deshacer toda la transaccin
Deshacer un trigger
Para deshacer un trigger, declarar un punto de grabacin y luego hacer el rollback
Un rollback sin punto de grabacin deshace toda la transaccin
Procedimiento almacenado
Caso A
begin tran
...
insert ...
print "in sp"
...
commit tran
print "sp done"
Trigger
save tran s1
....
rollback tran s1
print tr done
return
Procedimiento almacenado
Caso B
(este caso
ocaciona un
error)
begin tran
...
insert ...
print "in sp"
...
commit tran
print "sp done"
Trigger
begin tran s2
....
rollback tran s2
print tr done
return
Deshacer un trigger
rollback trigger deshace el trigger y la sentencia que lo
dispar
Sintaxis:
rollback trigger [with raiserror error_number
[error_statement] ]
Ejemplo:
create trigger trg_i_publishers
on publishers
for insert
as
if @@rowcount > 1
begin
rollback trigger with raiserror 40031
"You cannot insert more than one
publisher at a time."
return
end
Deshacer un trigger
Procedimiento almacenado
Case C
begin tran
...
insert ...
print "in sp"
...
commit tran
print "sp done"
Trigger
....
....
rollback trigger
print tr done
return
Procedimiento almacenado
Case E
begin tran
...
insert ...
print "in sp"
...
commit tran
print "sp done"
...
rollback tran
print "tr done
return
Trigger
....
....
Rollback tran
print tr done
return
Triggers anidados
Un trigger anidado es un trigger que se dispara en respuesta
a una modificacin hecha en un trigger
Triggers recursivos
Un trigger recursivo es aquel que se dispara cuando
modifica su propia tabla
Entity Integrity
Referential
Integrity
Constraints
Check
constraints
Primary key
constraints,
unique
constraints
References
constraints
Database
Objects
Rules
Indexes
Triggers
Restricciones
Triggers
Permitido
Permitido
Permitido
Permitido
No permitido*
Permitido
Permitido
Permitido
No permitido*
Permitido
Permitido
Permitido
Restricciones vs triggers
Ventajas de las restricciones:
Las restricciones (y reglas) son ms rpidas que los triggers
Las restricciones no requieren codificacin adicional
Es mejor para chequear datos antes de ingresarlos a la base
de datos