Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Pa Triggers
Pa Triggers
Procedimientos almacenados
Un procedimiento almacenado es un conjunto de sentencias SQL y de control de flujo Beneficios de los procedimientos almacenados:
Simplifican la ejecucin de tareas repetitivas Corren ms rpido que las mismas instrucciones ejecutadas en forma interactiva Reducen el trfico a travs de la red Pueden capturar errores antes que ellos puedan entrar a la base de datos Establece consistencia porque ejecuta las tareas de la misma forma Permite el desarrollo modular de aplicaciones Ayuda a proveer seguridad Puede forzar reglas y defaults complejos de los negocios
Triggers
Son procedimientos definidos por el usuario que se ejecutan automticamente cuando se modifica un dato en una tabla Procedimientos suministrados por el sistema Procedimientos que hacen llamadas al sistema operativo y ejecutan tareas a ese nivel
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
Ejemplo:
Ver el cdigo fuente de un procedimiento: Ejecutar el procedimiento: Borrar los objetos de bases de datos:
drop proc 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:
Pasar parmetros
Dos mtodos para pasar valores a parmetros:
Paso de parmetros por posicin Paso de parmetros por nombre
Ejemplo:
Los parmetros se deben pasar en el mismo orden en que ellos aparecen en la sentencia create procedure Como este mtodo es ms propenso a errores, se aconseja el paso por nombre
Los nombres de los parmetros en la sentencia exec deben concordar con los nombres de los parmetros usados en la sentencia create procedure Los parmetros pueden pasar en cualquier orden
state ----CA CA
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
Ejecutar el procedimiento con y sin un valor para el parmetro de entrada. Una sentencia fallar:
exec proc_hello_param exec proc_hello_param "<yourname>"
Crear un procedimiento almacenado que tiene un valor por default para un parmetro de entrada:
create proc proc_hello_def (@name varchar(30) = "whoever you are") 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>"
Cul procedimiento almacenado parece ser ms amigable? Borrar los objetos de bases de datos creados:
drop proc proc_hello_param, proc_hello_def
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:
Ejemplo:
declare @my_title char(6), @my_price money select @my_title = "PC8888" exec proc_new_price @my_title, @my_price output ---------23.00
Los valores que retornan los parmetros se pasan automticamente al conjunto respuesta El retorno de valores se pueden pasar por nombre o por posicin
Se recomienda el paso por nombre
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
Hay tres formas para forzar al servidor a generar un nuevo plan de bsqueda
Usar with recompile en el procedimiento Usar with recompile cuando se ejecute el procedimiento Usar sp_recompile
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
Yes
No
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
Las operaciones con registro mnimo (como select into) no disparan los triggers
Crear triggers
Sintaxis simplificada:
create trigger trigger_name on table_name for {insert | update | delete} [, {insert | update | delete} ...] as sql_statements
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:
sp_help trigger_name
Muestra informacin del trigger
sp_helptext trigger_name
Muestra el cdigo usado para crear el trigger
Triggers - ejemplo
Crear dos tablas:
select * into myauthors from pubs2..authors create table myrecord ( mytime myrows )
datetime, int
Crear un trigger que guarde la fecha y nmero de filas afectadas por cada delete:
create trigger trg_d_myauthors on myauthors for delete as insert into myrecord values (getdate(), @@rowcount) return
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
-- For deleted publishers, delete -- corresponding titles delete titles from titles t, deleted d where t.pub_id = d.pub_id -- Appropriate actions would take place here -- since a deleted publisher has far-reaching -- effects throughout the database. return
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
El trigger no puede modificar datos en las dos tablas Cada anidamiento de triggers tiene sus propias tablas inserted y deleted
Si un trigger modifica datos de su tabla asociada, esos cambios no se reflejan en las tablas inserted and deleted de ese trigger
Crear un trigger que use la funcin suser_name( ) para listar la(s) fila(s) que se borraron y el nombre del usuario:
create trigger trg_d_myauthors on myauthors for delete as select suser_name(), "deleted these rows:" select * 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 Trigger
Caso A begin tran ... insert ... print "in sp" ... commit tran print "sp done" begin tran ... insert ... print "in sp" ... commit tran print "sp done" save tran s1 .... rollback tran s1 print tr done return
Procedimiento almacenado
Caso B (este caso ocaciona un error)
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
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
Por default, un trigger que modifica su propia tabla no causa un disparo recursivo del trigger
Database Objects
*Valores de llaves primarias se pueden actualizar o borrar si no estn referencidos en llaves forneas
Solamente en triggers es posible borrar o actualizar una llave primaria Slo en triggers es posible hacer cambios en cascada
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
Mejor para las reglas complejas del negocio que no se pueden expresar como restricciones referenciales tales como actualizaciones o borrados en cascada