Procedimientos Almacenados y Triggers Zenen

67
Procedimientos almacenados, triggers

Transcript of Procedimientos Almacenados y Triggers Zenen

Page 1: Procedimientos Almacenados y Triggers Zenen

Procedimientos almacenados, triggers

Page 2: Procedimientos Almacenados y Triggers Zenen

Procedimientos almacenados• Un procedimiento almacenado es un conjunto de sentencias

SQL y de control de flujo• Beneficios de los procedimientos almacenados:

– Simplifican la ejecución de tareas repetitivas– Corren más rápido que las mismas instrucciones ejecutadas en

forma interactiva– Reducen el tráfico a través 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

Page 3: Procedimientos Almacenados y Triggers Zenen

Tipos de procedimientos almacenados

• Procedimientos almacenados definidos por el usuario– Son procedimientos definidos por el usuario que se

deben llamar explícitamente

• Triggers– Son procedimientos definidos por el usuario que se

ejecutan automáticamente cuando se modifica un dato en una tabla

• Procedimientos del sistema– Procedimientos suministrados por el sistema

• Procedimientos extendidos– Procedimientos que hacen llamadas al sistema operativo

y ejecutan tareas a ese nivel

Page 4: Procedimientos Almacenados y Triggers Zenen

Interactive Execution

Page 5: Procedimientos Almacenados y Triggers Zenen

Creación de un procedimiento almacenado

Page 6: Procedimientos Almacenados y Triggers Zenen

Ejecución de un procedimiento almacenado

Page 7: Procedimientos Almacenados y Triggers Zenen

Ventajas en el rendimiento

Un procedimiento almacenado se ejecuta más rápido 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 búsqueda, él usa el que

se hace en el momento de compilarlo• No se necesita crear un plan de búsqueda, porque ya el

procedimiento tiene uno

Page 8: Procedimientos Almacenados y Triggers Zenen

Crear y borrar procedimientos almacenados

• Sintaxis simplificada para create:create proc procedure_nameas

statementsreturn

• Ejemplo:create proc proc_update_titlesas

update titlesset price = price * $0.95where total_sales < 3000

return

• Sintaxis simplificada para drop:drop proc procedure_name

• Ejemplo:drop proc proc_update_titles

Page 9: Procedimientos Almacenados y Triggers Zenen

Ejecutar procedimientos almacenados

• Sintaxis simplificada:[exec | execute] procedure_name

• Ejemplo:execute proc_update_titles

Page 10: Procedimientos Almacenados y Triggers Zenen

Variables

• Los procedimientos almacenados pueden crear y usar variables locales– Las variables sólo existen mientras exista el procedimiento– Las variables no las puede usar otro proceso

• Ejemplo:create proc proc_update_under_half_titlesas

declare @max_sales int, @half_max realselect @max_sales = max(total_sales)

from titlesselect @half_max = @max_sales / 2select title, total_sales from titles

where total_sales < @half_maxupdate titles

set price = price * $0.95where total_sales < @half_max

return

Page 11: Procedimientos Almacenados y Triggers Zenen

Sentencias válidas e inválidas

• Un procedimiento almacenado puede:– Seleccionar y modificar datos– Crear tablas temporales y permanentes– Llamar otros procedimientos almacenados– Referenciar objetos de bases de datos

• Un procedimiento almacenado no puede ejecutar:– use database– create view– create default– create rule– create procedure– create trigger

Page 12: Procedimientos Almacenados y Triggers Zenen

Procedimientos almacenados y permisos

• Para permitir que otros usen un procedimiento almacenado, el propietario debe dar los respectivos permisos

• Sintaxis simplificada:grant executeon procedure_nameto user_list

• Ejemplo:grant executeon proc_update_titlesto tjovanka, vturlough, pbrown

Page 13: Procedimientos Almacenados y Triggers Zenen

Crear procedimientos almacenados

• Crear un procedimiento almacenado sencillo:create proc proc_helloas

print "Hello, <your_name>"return

• Ver el código fuente de un procedimiento:sp_helptext proc_hello

• Ejecutar el procedimiento:exec proc_hello

• Borrar los objetos de bases de datos:drop proc proc_hello

Page 14: Procedimientos Almacenados y Triggers Zenen

Parámetros de entrada

• An input Parámetro is a variable local to a procedimiento almacenado that can receive a value from the exec procedure Sentencia

Page 15: Procedimientos Almacenados y Triggers Zenen

Definir parámetros de entrada• Sintaxis simplificada:

create procedure procedure_name(parameter_name datatype default_value[, parameter_name datatype default_value...] )

asstatements

return

• Ejemplo:create proc proc_author_info

(@lname varchar(40), @fname varchar(20))as

-- lists the author and his or her booksselect au_lname, au_fname, titlefrom authors, titles, titleauthorwhere au_fname = @fnameand au_lname = @lnameand authors.au_id = titleauthor.au_idand titles.title_id = titleauthor.title_id

return

Page 16: Procedimientos Almacenados y Triggers Zenen

Pasar parámetros

• Dos métodos para pasar valores a parámetros:– Paso de parámetros por posición– Paso de parámetros por nombre

Page 17: Procedimientos Almacenados y Triggers Zenen

Paso de parámetros por posición• Sintaxis para paso por posición:

[exec | execute] procedure_name value [, value...]• Ejemplo:

exec proc_author_info "Ringer", "Albert"

au_lname au_fname title-------- -------- -----Ringer Albert Is Anger the Enemy?Ringer Albert Life Without Fear

• Los parámetros se deben pasar en el mismo orden en que ellos aparecen en la sentencia create procedure

• Como este método es más propenso a errores, se aconseja el paso por nombre

Page 18: Procedimientos Almacenados y Triggers Zenen

Paso de parámetros por nombre• Sintaxis para paso por nombre:

[exec | execute] procedure procedure_nameparameter_name = value [, parameter_name = value ]

• Ejemplo:exec proc_author_info

@lname = "Ringer", @fname = "Albert"

au_lname au_fname title-------- -------- -----Ringer Albert Is Anger the Enemy?Ringer Albert Life Without Fear

• Los nombres de los parámetros en la sentencia exec deben concordar con los nombres de los parámetros usados en la sentencia create procedure

• Los parámetros pueden pasar en cualquier orden

Page 19: Procedimientos Almacenados y Triggers Zenen

Valores por default

• Se puede asignar un valor por default a un parámetro cuando él no se indica en la sentencia exec

• Ejemplo:create proc proc_state_authors

(@state char(2) = "CA")as

select au_lname, au_fname, statefrom authorswhere state = @state

return

exec proc_state_authors -- No state value passed

au_lname au_fname state-------- -------- -----White Johnson CAGreen Marjorie CA...

Page 20: Procedimientos Almacenados y Triggers Zenen

Parámetros de entrada: errores comunes

• Los valores que se pasan no tienen el mismo tipo de datos que los parámetros definidos

• En la misma sentencia, se pasa un parámetro por posición después de haber pasado un parámetro por nombre– Aunque no es recomendado, es posible mezclar los dos métodos

para pasar valores, sin embargo, después de pasar un valor a un parámetro por nombre, todos los restantes de deben pasar por nombre

• Olvido de uno o más parámetros– El olvido de uno o más valores para los parámetros, hace que se

usen los valores por default• Los valores para los parámetros se pasan en un orden errado

Page 21: Procedimientos Almacenados y Triggers Zenen

create procedure proc_insert_sale(@stor_idchar(4)= NULL, @ord_num varchar(20)= NULL, @date datetime= NULL)

as/* If no date is passed, use the current date. */if (@date is NULL)begin

select @date = getdate()end

begin transaction/* insert sales order */insert sales (stor_id, ord_num, date)values (@stor_id, @ord_num, @date)

if @@error <> 0begin

rollback transactionraiserror 24001 "Transaction failed"return

endcommit transactionreturn

Parámetros de entrada: Ejemplo

Page 22: Procedimientos Almacenados y Triggers Zenen

Parámetros de entrada• Crear un procedimiento almacenado que tenga un parámetro

de entrada:create proc proc_hello_param (@name varchar(30))as

print "Hello %1!", @namereturn

• Ejecutar el procedimiento con y sin un valor para el parámetro de entrada. Una sentencia fallará:exec proc_hello_paramexec proc_hello_param "<yourname>"

• Crear un procedimiento almacenado que tiene un valor por default para un parámetro de entrada:create proc proc_hello_def

(@name varchar(30) = "whoever you are")as

print "Hello %1!", @namereturn

Page 23: Procedimientos Almacenados y Triggers Zenen

Parámetros de entrada

• Ejecutar el procedimiento con y sin un valor para el parámetro de entrada:exec proc_hello_defexec proc_hello_def "<yourname>"

• ¿Cuál procedimiento almacenado parece ser más amigable?

• Borrar los objetos de bases de datos creados:drop proc proc_hello_param, proc_hello_def

Page 24: Procedimientos Almacenados y Triggers Zenen

Retorno de valores

• A return Parámetro is a variable local to a procedimiento almacenado that can send a value to the exec procedure Sentencia

Page 25: Procedimientos Almacenados y Triggers Zenen

Crear parámetros que retornan valores

• Sintaxis simplificada:create procedure procedure_name

(parameter_name datatype output[, parameter_name datatype output...] )

asstatements

return• Ejemplo:create proc proc_new_price

(@title_id char(6), @new_price money output)

asselect @new_price = price

from titleswhere title_id = @title_id

select @new_price = @new_price * $1.15return

Page 26: Procedimientos Almacenados y Triggers Zenen

Usar parámetros que retornan valores

• Sintaxis simplificada:[exec | execute] procedure_name variable output

• Ejemplo:declare @my_title char(6), @my_price moneyselect @my_title = "PC8888"exec proc_new_price

@my_title, @my_price output

----------23.00

• Los valores que retornan los parámetros se pasan automáticamente al conjunto respuesta

• El retorno de valores se pueden pasar por nombre o por posición– Se recomienda el paso por nombre

Page 27: Procedimientos Almacenados y Triggers Zenen

Límite de anidamiento para procedimientos

• Los procedimientos almacenados pueden llamar otros procedimientos almacenados– El máximo nivel de anidamiento es 16– La variable @@nestlevel contiene el nivel de anidamiento

actual• Si se excede el nivel máximo:

– Se abortan los procedimientos pendientes– El servidor retorna un error

Page 28: Procedimientos Almacenados y Triggers Zenen

Planes de búsqueda

• Un plan de búsqueda es un conjunto ordenado de etapas que se requieren para acceder los datos, incluyendo información sobre:– Si usar o no un índice– El índice a usar– El orden en el cual las tablas se deben encadenar

• Los planes de búsqueda son creados por el optimizador de búsquedas– El optimizador de búsquedas usa información acerca de los objetos de base de

datos para producir el plan• Los planes de búsqueda creados para los procedimientos, se reutilizan

– Cuando se ejecuta un procedimiento almacenado, el servidor chequea el caché del procedimiento para un plan no usado

– Si hay un plan de búsqueda no utilizado, el servidor lo usa– Si no hay un plan de búsqueda no utilizado, el servidor genera uno nuevo del

árbol de búsqueda en sysprocedures

Page 29: Procedimientos Almacenados y Triggers Zenen

Planes de búsqueda sub-óptimos

• El plan de búsqueda creado para la una ejecución de un procedimiento almacenado puede que no sea el plan de búsqueda óptimo para la siguiente ejecución del procedimiento almacenado– Las dos ejecuciones pueden usar parámetros de entrada muy diferentes– Se pueden haber añadido nuevos índices entre las dos ejecuciones– El tamaño de las tablas accedidas pueden haber cambiado significativamente

entre las dos ejecuciones• Hay tres formas para forzar al servidor a generar un nuevo plan de

búsqueda– Usar with recompile en el procedimiento– Usar with recompile cuando se ejecute el procedimiento– Usar sp_recompile

Page 30: Procedimientos Almacenados y Triggers Zenen

• En un procedimiento, usar la opción with recompile para forzar al servidor a crear un nuevo plan de búsqueda cada vez que se ejecute el procedimiento

• Sintaxis simplificada:create proc procedure_namewith recompileas

statementsreturn

Crear procedimientos con recompile

Page 31: Procedimientos Almacenados y Triggers Zenen

• Ejemplo:create proc proc_list_California_authors

(@early_name varchar(80), @late_name varchar(80))with recompileas

select au_id, au_lname, au_fnamefrom authorswhere au_lname between @early_name and

@late_nameand state = "CA"

order by au_lnamereturn

Crear procedimientos con recompile

Page 32: Procedimientos Almacenados y Triggers Zenen

Ejecución de procedimientos with recompile

• Cuando se ejecute un procedimiento almacenado, usar la opción with recompile para forzar al servidor a crear un nuevo plan de búsqueda para esa ejecución del procedimiento

• Esta opción se puede usar cuando se ejecuta cualquier procedimiento almacenado

• Sintaxis simplificada:[exec | execute] procedure_name with recompile

• Ejemplo:execute proc_update_titles with recompile

Page 33: Procedimientos Almacenados y Triggers Zenen

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

Page 34: Procedimientos Almacenados y Triggers Zenen

Trigger

• Un trigger es un procedimiento almacenado asociado con una tabla, el cual se ejecuta automáticamente cuando se modifica un dato de esa tabla

Can It Be

Explicitly

Called?

Can It Be

Executed

Automatically?

Can It Use

Parameters?

User-Defined

Stored

Procedure

Yes No Yes

Trigger No Yes No

Page 35: Procedimientos Almacenados y Triggers Zenen

Aplicaciones Típicas de triggers

• Hacer modificaciones en cascada sobre tablas relacionadas

• Deshacer cambios que violan la integridad de los datos• Forzar restricciones que son muy complejas para

reglas y restricciones• Mantener datos duplicados• Mantener columnas con datos derivados• Hacer ajustes de registros

Page 36: Procedimientos Almacenados y Triggers Zenen

Definición de un trigger• Un trigger se define asociado con una tabla para una o

más sentencias de manipulación de datos– Un trigger se puede definir para insert, update, o delete o

cualquier combinación de ellos

Page 37: Procedimientos Almacenados y Triggers Zenen

Activación 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 número

de filas afectadas– El trigger se dispara aunque no hayan filas afectadas

Page 38: Procedimientos Almacenados y Triggers Zenen

Triggers and transacciones

• Un trigger es parte de la transacción que causa el disparo

• El trigger puede deshacer:– Así mismo solamente– Así mismo y la sentencia que causa el disparo– La transacción total

Page 39: Procedimientos Almacenados y Triggers Zenen

Reglas para triggers

• Los triggers pueden:– Declarar variables locales– Invocar procedimientos almacenados

• Los triggers no pueden:– Llamarse directamente– Usar parámetros– Definirse sobre tablas temporales o vistas– Crear objetos permanentes de base de datos

• Las operaciones con registro mínimo (como select into) no disparan los triggers

Page 40: Procedimientos Almacenados y Triggers Zenen

Crear triggers

• Sintaxis simplificada:create trigger trigger_nameon table_namefor {insert | update | delete} [, {insert | update | delete} ...]as

sql_statements

• Ejemplo:create trigger trg_i_saleson salesfor insertas if datename (dd,getdate()) = "Sun"

begin raiserror 40070, "Sales cannot be processed on Sunday." rollback triggerend

Page 41: Procedimientos Almacenados y Triggers Zenen

Borrar Triggers

• Sintaxis simplificada:drop trigger trigger_name

• Ejemplo:drop trigger trg_i_sales

Page 42: Procedimientos Almacenados y Triggers Zenen

Procedimientos del sistema para procedimientos almacenados

• sp_depends {table_name | trigger_name}– Cuando se da el nombre de tabla, lista todos los

objetos (incluyendo triggers) de la misma base de dtos

– Cuando se da el nombre de trigger, lista todas las tablas referencias

• sp_help trigger_name– Muestra información del trigger

• sp_helptext trigger_name– Muestra el código usado para crear el trigger

• sp_rename old_trigger_name, new_trigger_name– Cambia el nombre del trigger

Page 43: Procedimientos Almacenados y Triggers Zenen

Triggers - ejemplo

• Crear dos tablas:select * into myauthors

from pubs2..authorscreate table myrecord (

mytime datetime,myrows int

)

• Crear un trigger que guarde la fecha y número de filas afectadas por cada delete:create trigger trg_d_myauthorson myauthorsfor deleteas

insert into myrecordvalues (getdate(), @@rowcount)

return

Page 44: Procedimientos Almacenados y Triggers Zenen

Triggers - ejemplo

• Ejecutar un delete y ver la tabla myrecords:delete from myauthors

where state = "CA"select * from myrecord

• Ejecutar un delete que no afecta filas y ver la tabla myrecords :delete from myauthors

where 1 = 2select * from myrecord

• Borrar los objetos de base de datos creados:drop table myauthors, myrecord

Page 45: Procedimientos Almacenados y Triggers Zenen

Las tablas inserted y deleted

• inserted y deleted son dos tablas que se crean automáticamente cada vez que se dispara un trigger– inserted almacena cualquier fila que se vaya a añadir a la tabla– deleted almacena cualquier fila que se vaya a borrar de la tabla

Page 46: Procedimientos Almacenados y Triggers Zenen

Borrados

• A delete adds rows to the deleted table

Page 47: Procedimientos Almacenados y Triggers Zenen

Uso de la tabla deleted - ejemplo

create trigger trg_d_publisherson publishers for deleteas

-- Exit trigger if no rows were modified.if @@rowcount = 0

return

-- For deleted publishers, delete -- corresponding titles delete titles

from titles t, deleted dwhere t.pub_id = d.pub_id

-- Appropriate actions would take place here -- since a deleted publisher has far-reaching -- effects throughout the database.

return

Page 48: Procedimientos Almacenados y Triggers Zenen

Inserciones

• An insert adds rows to the inserted table

Page 49: Procedimientos Almacenados y Triggers Zenen

Uso de la tabla inserted - ejemplo

-- Make sure all au_ids matchif (select count(*) from authors a, inserted i

where a.au_id=i.au_id ) <> @num_rowsbegin

raiserror 31114 "Attempt to insert invalid au_id into titleauthor."

rollback transactionreturn

endreturngo

Page 50: Procedimientos Almacenados y Triggers Zenen

-- Insert and update trigger on titleauthorcreate trigger trg_iu_titleauthoron titleauthorfor insert, update as-- Find out how many rows were modifieddeclare @num_rows intselect @num_rows=@@rowcountif @num_rows=0

return-- Make sure all title_ids matchif (select count(*) from titles t, inserted i

where t.title_id=i.title_id) <> @num_rowsbegin

raiserror 31113 "Attempt to insert invalid title_id into titleauthor."

rollback transactionreturn

end

Uso de la tabla inserted - ejemplo

Page 51: Procedimientos Almacenados y Triggers Zenen

Actualizaciones

• An update adds rows to both tables

Page 52: Procedimientos Almacenados y Triggers Zenen

-- Insert, update, and delete trigger on salesdetail

create trigger trig_iud_salesdetailon salesdetailfor insert, update, deleteas

-- Exit trigger if no rows were modified.if @@rowcount = 0

return

Uso de las tablas inserted y deleted

Page 53: Procedimientos Almacenados y Triggers Zenen

-- If a new quantity has been inserted or updated for a-- given title_id, add the value to titles.total_sales. The-- isnull function is used because titles.total_sales might-- be NULL.

update titlesset total_sales = isnull(total_sales, 0) +

(select sum(qty)from insertedwhere titles.title_id = inserted.title_id)

where title_id in (select title_id from inserted)

Uso de las tablas inserted y deleted

Page 54: Procedimientos Almacenados y Triggers Zenen

-- If an old quantity has been updated or deleted for a-- given title_id, subtract the value from-- titles.total_sales. The isnull function is used because-- titles.total_sales might be NULL.

update titlesset total_sales = isnull(total_sales, 0) -

(select sum(qty)from deletedwhere titles.title_id = deleted.title_id)

where title_id in (select title_id from deleted)

return

Uso de las tablas inserted y deleted

Page 55: Procedimientos Almacenados y Triggers Zenen

Reglas para las tablas inserted y deleted

• Ambas tablas tienen las mismas columnas que la tabla asociada al trigger

• El trigger puede consultar datos de las dos tablas– Otros procesos no pueden consultar datos de las dos tablas

• 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

Page 56: Procedimientos Almacenados y Triggers Zenen

Tablas inserted and deleted - ejemplo

• Crear una tabla:select * into myauthors

from pubs2..authors

• Crear un trigger que use la función suser_name( ) para listar la(s) fila(s) que se borraron y el nombre del usuario:create trigger trg_d_myauthorson myauthorsfor deleteas

select suser_name(), "deleted these rows:"select * from deleted

return

• Ejecutar un delete que afecte más de una fila:delete from myauthors

where state = "CA"

Page 57: Procedimientos Almacenados y Triggers Zenen

Tablas inserted and deleted - ejemplo

• Ejecutar un delete que no afecte filas:delete from myauthors

where 1 = 2

• Borrar los objetos de base de datos:drop table myauthors

Page 58: Procedimientos Almacenados y Triggers Zenen

Triggers y rollbacks

• Tres tipos de rollbacks:– Deshacer el trigger– Deshacer el trigger y la sentencia que lo disparó– Deshacer toda la transacción

Page 59: Procedimientos Almacenados y Triggers Zenen

Deshacer un trigger• Para deshacer un trigger, declarar un punto de grabación y luego

hacer el rollback– Un rollback sin punto de grabación deshace toda la transacciónProcedimiento almacenado

Caso A begin tran...insert ...print "in sp"...commit tranprint "sp done"

Triggersave tran s1....rollback tran s1print “tr done”return

Procedimiento almacenadoCaso B begin tran

...(este caso insert ...ocaciona un print "in sp"error) ...

commit tranprint "sp done"

Triggerbegin tran s2....rollback tran s2print “tr done”return

Page 60: Procedimientos Almacenados y Triggers Zenen

• 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_publisherson publishersfor insertas

if @@rowcount > 1begin rollback trigger with raiserror 40031

"You cannot insert more than one publisher at a time."

returnend

Deshacer un trigger

Page 61: Procedimientos Almacenados y Triggers Zenen

Procedimiento almacenado

Case C begin tran...insert ...print "in sp"...commit tranprint "sp done"

Trigger........rollback triggerprint “tr done”return

Deshacer un trigger

Page 62: Procedimientos Almacenados y Triggers Zenen

Procedimiento almacenadoCase D begin tran

...insert ...print "in sp"...commit tranprint "sp done"

Triggerbegin tran...rollback tranprint "tr done”return

• Para deshacer toda la transacción donde está inmerso el trigger, ejecutar un rollback sin un punto de grabación

Procedimiento almacenado

Case E begin tran...insert ...print "in sp"...commit tranprint "sp done"

Trigger........Rollback tranprint “tr done”return

Deshacer una transacción

Page 63: Procedimientos Almacenados y Triggers Zenen

Triggers anidados• Un trigger anidado es un trigger que se dispara en respuesta

a una modificación hecha en un trigger

• Nivel máximo de anidamiento: 16– Tanto los procedimientos almacenados como los triggers cuentan

en la determinación del nivel máximo– @@nestlevel retorna el nivel de anidamiento

Page 64: Procedimientos Almacenados y Triggers Zenen

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

Page 65: Procedimientos Almacenados y Triggers Zenen

Métodos para integridad de datos

• Dos métodos para implementar integridad de datos

Domain

Integrity Entity Integrity Referential

Integrity

Constraints

Check constraints

Primary key constraints, unique constraints

References constraints

Database Objects

Rules Indexes Triggers

Page 66: Procedimientos Almacenados y Triggers Zenen

Actualización de valores llave

*Valores de llaves primarias se pueden actualizar o borrar si no están referencidos en llaves foráneas

• Solamente en triggers es posible borrar o actualizar una llave primaria

• Sólo en triggers es posible hacer cambios en cascada

Acción deseada Restricciones Triggers

Insertarar valor de llave primaria Permitido Permitido

Insertar valor de llave foránea Permitido Permitido

Actualizar valor de llave primaria No permitido* Permitido

Actualizar valor de llave foránea Permitido Permitido

Borrar valor de llave primaria No permitido* Permitido

Borrar valor de llave foránea Permitido Permitido

Page 67: Procedimientos Almacenados y Triggers Zenen

Restricciones vs triggers

• Ventajas de las restricciones:– Las restricciones (y reglas) son más rápidas que los triggers– Las restricciones no requieren codificación adicional– Es mejor para chequear datos antes de ingresarlos a la base

de datos• Ventajas de los triggers:

– Muy flexible• Los triggers pueden hacer cualquier cosa que se pueda codificar

– Mejor para las reglas complejas del negocio que no se pueden expresar como restricciones referenciales tales como actualizaciones o borrados en cascada