conceptos de bases de datos relacionales parte 3
TRANSCRIPT
![Page 1: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/1.jpg)
Conceptos de Bases de Datos Relacionales
Parte 3
![Page 2: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/2.jpg)
Ambiente de ejecución• El código se puede ejecutar en:
– Cliente– Servidor
• Ventajas de programar en el lado cliente– Atiende usuarios finales con diferentes necesidades– Evita tráfico en la red– Se distribuye una parte del procesamiento– Puede facilitar la interacción del usuario
• Ventajas de programar en el lado servidor– Se tiene concentración de los recursos– Uniformiza la aplicación de las reglas del negocio– Se puede actualizar más fácilmente el código
![Page 3: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/3.jpg)
Batch
• Una o más sentencias enviadas y ejecutadas como una sola
• Ejemplo:delete sales
where stor_id = "5023"and ord_num = "AB-123-DEF-425-1Z3"
delete salesdetailwhere stor_id = "5023"and ord_num = "AB-123-DEF-425-1Z3"
select * from sales where stor_id = "5023"
select * from salesdetail where stor_id = "5023"
go
![Page 4: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/4.jpg)
Restricciones de los batch• Esta sentencias deben tener su propio batch:
– create default– create rule– create procedure– create trigger– declare cursor
• No se puede borrar y recrear un objeto en el mismo batch
• sentencia use• No se puede asignar una rule o default a una
columna e insertarle valores en el mismo batch
![Page 5: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/5.jpg)
Comentarios
• Porción de código ignorado por el servidor• Usados para documentar• Dos formas:
-- comentario hasta el final de una línea /* comentario */
![Page 6: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/6.jpg)
Variables locales
• Variable local: nombre de una posición de memoria para almacenar un valor
• Uso típico de las variables locales– Para facilitar el uso repetido de valores constantes– Para ejecutar bifurcamiento en código SQL– Para capturar mensajes que contienen información variable– Para intercambio de información con stored procedures– Para evitar el uso de subquerys
![Page 7: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/7.jpg)
Asignación con select y expresiones• Sintaxis simplificada:
select variable_name = expression[, variable_name = expression ...]
• Ejemplos:declare @number int,
@copy int,@sum int
select @number = 10
select @copy = @number,@sum = @number + 100
• Si select no retorna valores, la variable no cambia su valor
![Page 8: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/8.jpg)
Asignación con select y valores de tabla
• Sintaxis simplificada:select variable_name = column_namefrom table_name[where condition]
• Ejemplos:declare @AD_id char(11)select @AD_id = au_id
from authorswhere au_fname = "Ann" and au_lname = "Dull"
• Si el select retorna múltiples valores, solamente toma el último
![Page 9: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/9.jpg)
Asignación con update
• Sintaxis simplificada:update table_nameset {column_name | variable_name } = expression [, {column_name | variable_name } = expression ... ][where condition]
• Ejemplos:declare @pub_name varchar(40)update publishers
set city = "Escanaba",state = "MI",@pub_name = pub_name
where pub_id = "0736"
• Si update modifica múltiples filas, solamente el último asignado permanece en la variable
![Page 10: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/10.jpg)
Ejemplo
• Las variables se deben declarar antes de usarlas• Ejemplo:
select pub_id from publishers
select @myvar = total_salesfrom titleswhere title_id = "BU2075"
select @myvar
Server Message: Number 137, Severity 15Line 3:
Must declare variable '@myvar'.
![Page 11: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/11.jpg)
Ejemplo• Los valores de las variables deben de concordar con
el tipo de dato de la variable• Ejemplo:
declare @myvariable int
select @myvariable = titlefrom titleswhere title_id = "BU2075"
select @myvariable
Server Message: Number 257, Severity 16Line 2:Implicit conversion from datatype 'VARCHAR' to'INT' is not allowed. Use the CONVERT function torun this query.
![Page 12: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/12.jpg)
Ejemplo
• Si el select no retorna valores, la variable no cambia• Ejemplo:declare @value int
select @value = total_sales from titleswhere title_id = "BU2075"
select @value as "BU2075 sales"
select @value = total_sales from titleswhere title_id = "BU11" -- should be "BU1111"
select @value as "BU1111 sales"
Primer query: Segundo query:BU2075 sales BU1111 sales------------ ------------
18722 18722
![Page 13: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/13.jpg)
Ejemplo
• Las variables locales se borran al terminar el batch que las crea-- Declare a local variable:declare @pub_var char(4)
-- Assign the variable a value from a table:select @pub_var = pub_id
from pubs2..publisherswhere pub_name = "New Age Books"
-- View the variable’s value:select @pub_var
![Page 14: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/14.jpg)
--- Use the variable in a select statement:select title_id, title, pub_id
from pubs2..titleswhere pub_id = @pub_var
- Execute the batch. (Users of SQL Advantage do-- not need to enter "go" to complete this step):
go
![Page 15: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/15.jpg)
Variables globales
• Variable global: nombre de una posición de memoria para almacenar un valor definido y mantenido por el servidor
![Page 16: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/16.jpg)
Ejemplo
• Ejemplo:delete from titles
where type = "popular_comp"select @@rowcount
------3
![Page 17: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/17.jpg)
Ejemplo
• Ejemplo:delete from titles
where type = "popular_comp"select @@error
------0
![Page 18: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/18.jpg)
Ejemplo
• Ejemplo:-- The word "from" is misplaceddelete titles from
where type = "psychology"
Server Message: Number 156, Severity 15Line 4:Incorrect syntax near the keyword 'where'.
select @@error
------ 156
![Page 19: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/19.jpg)
Ejemplo
• Crear una tabla:select * into mytitles
from pubs2..titles
• Intentar borrar una tabla inexistente @@error:delete from no_tableselect @@error
• Ejecutar un delete con una condición que nunca se cumple:delete from mytitles
where 1 = 2select @@error
![Page 20: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/20.jpg)
• ¿El segundo delete genera un error? ¿Por qué o por qué no?
• Borrar los objetos de bases de datos creados:drop table mytitles
![Page 21: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/21.jpg)
Sentencias de control de flujo
• Por default los servidores ejecutan las sentencias en el orden en que ellas aparecen
• Las siguientes son sentencias de control de flujo:– if...else– begin...end– if exists– while– break– continue– return
![Page 22: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/22.jpg)
if...else
• Sintaxis simplificada:if condition
block_to_execute_when_condition_is_true[ else
block_to_execute_when_condition_is_false ]
• Ejemplo:delete from titles
where type = "mod_cook"if @@error <> 0
select "An error has occurred!"else
select "The delete was successful."
![Page 23: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/23.jpg)
Condiciones anidadas
• Ejemplo:delete from titles
where type = "mod_cook"if @@rowcount = 0
select "No rows were deleted."else
if @@rowcount = 1select "One row was
deleted."else
select "Multiple rows were deleted."
![Page 24: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/24.jpg)
begin...end
• Sintaxis:begin statement statement ...end
• Ejemplo:...if @temp_id = "TC4203"
begin select @temp_type = "trad_cook" delete titles where type = "trad_cook"end
elsebegin select "Title has already been deleted"end
![Page 25: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/25.jpg)
if exists
• Sintaxis simplificada:if [ not ] exists ( select_statement )
code_to_execute_when_condition_is_true[ else
code_to_execute_when_condition_is_false ]
• Ejemplo:if exists (select * from titles
where price > $50.00)update titles set price = price * $0.90
elseselect "All titles priced under $50.00"
![Page 26: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/26.jpg)
Ejemplo
• Ejemplo:if exists (select * from sysobjects
where name = "vw_utah_authors"
and type = "V")drop view vw_utah_authors
gocreate view vw_utah_authors
asselect * from authorswhere state = "UT"with check option
![Page 27: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/27.jpg)
Sentencias if • Ejemplo:if (select avg(price) from pubs2..titles) > $25
select "These books are expensive."else
select "These books are a bargain."
• Ejemplo :drop table mysales
• Ejemplo :if exists (select * from sysobjects
where name = "mysales"and type = "U")
drop table mysales
![Page 28: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/28.jpg)
while• Sintaxis:
while conditionblock_to_execute
• Ejemplo:while (select avg(price) from titles) < $40
beginupdate titlesset price = price + $2
end
![Page 29: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/29.jpg)
Ejemplo
• Ejemplo:declare @price moneyselect @price = price
from titleswhere title_id = "PS1372"
while @price < $30begin
update titlesset price = price * $1.10where title_id = "PS1372"
end
-- The loop updates the price of PS1372, but-- never updates the value of @price. Because-- the loop condition is based on @price,-- execution of the loop would never terminate.
![Page 30: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/30.jpg)
break
• Ejemplo:
-- While the average price is greater than-- $20, this loop cuts all prices in half.-- However, if the maximum price falls below-- $40, the loop is immediately terminated.
while (select avg(price) from titles) > $20begin update titles
set price = price / 2 if (select max(price) from titles) <
$40break
end
![Page 31: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/31.jpg)
continue
• Ejemplo:-- While @price is less than $20, this loop adds-- $1 to @price. If there are 5 or more titles-- at @price, it restarts the loop. Otherwise,-- it increases all books priced at @price by 10%....while @price < $20.00
beginselect @price = @price + $1.00if (select count(price) from titles
where price = @price) >= 5
continueelse
update titlesset price = price * $1.10where price = @price
end
![Page 32: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/32.jpg)
return
• Ejemplo:-- @avg_price is declared and set to the average-- price in titles. If the average is less than-- $10, execution exits the entire batch.-- Otherwise, it continues execution.
declare @avg_price moneyselect @avg_price = avg(price) from titlesif @avg_price < $10
returnwhile @avg_price < $20
beginupdate titles
set price = price * $0.95select @avg_price = avg(price) from
titlesend
![Page 33: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/33.jpg)
Ciclos while
• Ejemplo:declare @x moneyselect @x = $0while @x < (select max(price) from pubs2..titles)
beginselect @x = @x + $1select "Titles less than $", @xselect price, title
from pubs2..titleswhere price < @x
end
![Page 34: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/34.jpg)
select
• Sintaxis simplificada:select { "user_message" | variable_name | column_list }
• Ejemplo:select "The average price is too low."
select "The average price is ", @avg_price
select "The average price is ", avg(price)from titles
• Puede retornar texto, valores variables, y datos de tabla en cualquier combinación
![Page 35: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/35.jpg)
![Page 36: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/36.jpg)
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 37: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/37.jpg)
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 38: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/38.jpg)
Interactive Execution
![Page 39: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/39.jpg)
Creación de un procedimiento almacenado
![Page 40: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/40.jpg)
Ejecución de un procedimiento almacenado
![Page 41: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/41.jpg)
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 42: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/42.jpg)
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 43: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/43.jpg)
Ejecutar procedimientos almacenados
• Sintaxis simplificada:[exec | execute] procedure_name
• Ejemplo:execute proc_update_titles
![Page 44: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/44.jpg)
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 45: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/45.jpg)
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 46: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/46.jpg)
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 47: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/47.jpg)
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 48: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/48.jpg)
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 49: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/49.jpg)
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 50: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/50.jpg)
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 51: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/51.jpg)
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 52: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/52.jpg)
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 53: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/53.jpg)
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 54: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/54.jpg)
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 55: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/55.jpg)
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 56: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/56.jpg)
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 57: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/57.jpg)
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 58: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/58.jpg)
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 59: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/59.jpg)
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 60: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/60.jpg)
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 61: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/61.jpg)
Retorno de parámetros: Ejemplo
Este proceso batch procesa las órdenes contra el inventario actual. El ítem y la cantidad ordenada de cada ítem se pasan a un procedimiento que hace la baja en el inventario e indica la cantidad despachada. Si el inventario alcanza para hacer el despacho, ese valor se retorna. Si el despacho es parcial, se retorna el valor de unidades despachadas. Si no había existencias, el valor retornado es igual a cero.
![Page 62: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/62.jpg)
Retorno de parámetros: Ejemplo
• Programa batch :declare @qty_ordered int,
@actual_qty int,@item_ordered char(10)
select @qty_ordered = 50select @actual_qty = @qty_orderedselect @item_ordered = "1095-87654"
exec proc_dec_inventory @item_ordered, @actual_qty output
-- additional processing here.-- Includes error handling, etc.
select "Quantity shipped is " +convert(char(10),@actual_qty) + " out of " + convert (char(10), @qty_ordered)
![Page 63: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/63.jpg)
Retorno de parámetros: Ejemplo
• Procedimiento proc_dec_inventory :create proc proc_dec_inventory
(@item_ordered char(10), @actual_qty int output)
asdeclare @qty_stock int,
@back_order intselect @back_order = 0if not exists (select * from inventory
where item = @item_ordered)begin
raiserror 20010 "Item not listed."return
endselect @qty_stock=stock from inventory
where item = @item_ordered
![Page 64: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/64.jpg)
Retorno de parámetros: Ejemplo
if @qty_stock < @actual_qtyselect @back_order = @actual_qty - @qty_stock,
@actual_qty = @qty_stockupdate inventory
set stock = stock - @actual_qty,backordered_qty = @back_order +
backordered_qty
where @item_ordered = itemreturn
![Page 65: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/65.jpg)
Retorno de parámetros - Ejemplo• Crear un procedimiento almacenado que tiene un parámetro
de entrada y uno de retorno:create proc proc_hello_out
(@name varchar(30), @message varchar(30) output)
asprint "Hello %1!", @nameif @name like "%u%"
select @message = "You have a u!"else
select @message = "No u today."return
• Declarar una variable y ejecutar el procedimiento:declare @temp varchar(30)exec proc_hello_out "<your_name>", @temp output
• Borrar los objetos de base de datos creados:drop proc proc_hello_out
![Page 66: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/66.jpg)
![Page 67: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/67.jpg)
Legibilidad
• Para hacer un código más legible:– Utilizar comentarios– Utilizar indentación– Usar espacios en blanco y dejar el código
organizado en columnas– Declarar e iniciar las variables en un bloque
• Establecer un conjunto de buenas prácticas para legibilidad
![Page 68: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/68.jpg)
Legibilidad - ejemplocreate proc proc_insert_titleauthor
(@tid char(6) = NULL, @aid char(11) = NULL, @au_ord tinyint = NULL, @royal int = NULL)
as/********************************************************************************************************* Stored Procedure:proc_insert_titleauthor** Creation Date: 4/1/95** Author: D. Normalize
![Page 69: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/69.jpg)
** Purpose:** Receives four parameters containing values that are** inserted into the titleauthor table of the pubs2 data-** base. Sets default parameter values as required for ** error checking and usage confirmation. Verifies refer-** ential integrity in the titles and authors tables.** Inserts these parameter values into the table. Rolls** back the transaction and returns a custom error** message and return status if the insertion fails.**** Input Parameters:** @tid the title id of the book, default is NULL** @aid the author id of the author of the book, ** default is NULL** @au_ord the author number (1-n) for counting the** number of authors for the book, default is** NULL** @royal percentage of the royalty received by the** author (0 to 100), default is NULL
Legibilidad - ejemplo
![Page 70: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/70.jpg)
** Return Parameters: <none>
**
** Return Status:
** -500 Incorrect usage
** -200 Insertion failed
** -405 Referential integrity check failed
**
** Usage:
** declare @retstatus int
** exec @retstatus=proc_insert_titleauthor @tid,
** @aid,
** @au_ord,
** @royal
** Local Variables
** @err stores the error number resulting from command
** execution
Legibilidad - ejemplo
![Page 71: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/71.jpg)
** Called by:** any calling program run by a user with execute** permission on this stored procedure**** Calls:<none>** ** Data Modifications:** inserts new data into the titleauthor table**** Updates:** Date Author Changes** 5/1/95 A. Bug specified default values*********************************************************/
Legibilidad - ejemplo
![Page 72: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/72.jpg)
declare @err int
/* Check for required parameters. */if (@tid is NULL or @aid is NULL) begin
raiserror 30010 "Usage:proc_insert_titleauthor title_id, au_id"
return -500end
begin transaction/* Check that the title_id and au_id passed to this** procedure are valid values in the titles and author** tables respectively. If not, return an error message. */
Legibilidad - ejemplo
![Page 73: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/73.jpg)
if exists (select * from titles where title_id=@tid)and exists (select 1 from authors where au_id =@aid)
begininsert titleauthor values(@aid,@tid,@au_ord,@royal)if @@error <> 0beginrollback transactionraiserror 21005 "Insertion into titleauthor failed. Transaction failed."return -200
endend
else /* Referential Integrity check failed. */beginrollback transactionraiserror 30020 "title_id or au_id not valid"return -405
endcommit transactionreturngo
Legibilidad - ejemplo
![Page 74: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/74.jpg)
Chequeo de valores que van a ser parámetros de entrada
• El servidor sólo chequea que los valores y sus respectivos parámetros concuerden en el tipo de datos
• Los procedimientos almacenados deben verificar que los valores pasados se encuentren dentro del dominio establecido
![Page 75: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/75.jpg)
Mensajes de error por omisión de valores para los parámetros
• Si un procedimiento almacenado requiere valores para los parámetros, el usuario debe incluir un tratamiento de esos errores y un manejo de mensajes de error
• Ejemplo:create proc proc_cutoff
(@title_id char(6) = NULL, @max_price money = NULL)
asif @title_id is NULL or @max_price is NULLbegin
raiserror 20001"Execution for this procedure is:exec proc_cutoff title_id, max_price"return
end...
return
![Page 76: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/76.jpg)
Rótulos de modo de transacción
• Los procedimientos almacenados se rotulan con el modo de transacción con el cual fueron creados– No se puede ejecutar una transacción en un modo diferente al del
rótulo
![Page 77: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/77.jpg)
sp_procxmode• sp_procxmode permite ver y cambiar el modo de transacción de un
procedimiento
• Sintaxis:sp_procxmode [ procedure_name [ , {chained | unchained | anymode} ] ]
• Ejemplo:sp_procxmode proc_update_titles, unchained
![Page 78: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/78.jpg)
Rótulos de modo de transacción
• Fijar modo chained:set chained on
• Crear un procedimiento sencillo:create proc tagtestas
print "Tag test"return
• Fijar modo unchained:set chained off
• Ejecutar el procedimiento:exec tagtest
• ¿Qué clase de error resulta?
![Page 79: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/79.jpg)
Rótulos de modo de transacción
• Cambiar el rótulo del modo de transacción:sp_procxmode tagtest, unchained
• Ejecutar el procedimiento:exec tagtest
• Borrar los objetos de base de datos creados:drop proc tagtest
![Page 80: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/80.jpg)
Retorno de valores de estado
• A return status is a value that indicates whether or not the procedure successfully completed
![Page 81: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/81.jpg)
Retorno de valores de estado
Values Meaning
Greater than 0 No predefined meaning; available for user-detected errors
0 Successful completetion
-1 through –99 System-detected error
Less than –99 No predefined meaning; available for user-detected erros
![Page 82: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/82.jpg)
Retorno de valores de estado
• Sintaxis simplificada:create proc procedure_nameas
statementsreturn [return_status]
• Ejemplo:create proc proc_datacheckasif (select max(total_sales) from titles) < 3000
beginprint "All the books have sold
less than 3000."return 100
endelse
...return 0
![Page 83: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/83.jpg)
Captura del valor del estado de retorno
• Los valores de retorno se deben capturar en variables• Sintaxis simplificada:
[exec | execute] variable = procedure_name parameter_list
• Ejemplo:declare @status intexec @status = proc_datacheckif @status = 100
exec proc_max_under_3000else
print "proc_datacheck was successful"
![Page 84: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/84.jpg)
Retorno de valores de estado -Ejemplo
• Procedimiento que retorna un estado:create proc proc_author_addr
(@lname varchar(40))as-- Procedure to display an author’s address and to -- determine if an author exists. Returns -900 if-- the author’s name is not in the authors table if not exists (select * from authors
where upper(au_lname) likeupper(@lname)+"%")
return -900--error status select au_id, au_fname, au_lname, phone,
address, city, state, postalcodefrom authorswhere upper(au_lname) like upper(@lname)+"%"
return 0-- successful execution of proc -- ‘0’ is returned if no other value specified
![Page 85: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/85.jpg)
Retorno de valores de estado -Ejemplo
• Calling program that checks the return status:-- ret_status: local variable to hold return status declare @ret_status intexec @ret_status = proc_author_addr @lname="tr"if @ret_status <> 0
begin -- Error handling code here print "Error finding name."return
endelse
beginprint "Name was found."
end
Returned by Server: (return status = -900)
Error finding name.
![Page 86: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/86.jpg)
Retorno de valores de estado
• Crear un procedimiento sencillo:create proc status_test (@value int)as
if @value < 10return 50
return 70
• Dar el valor “5” y capturar el valor de retorno:declare @input int, @status intselect @input = 5exec @status = status_test @inputselect @status
• Dar el valor “22” y capturar el valor de retorno:declare @input int, @status intselect @input = 22exec @status = status_test @inputselect @status
![Page 87: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/87.jpg)
Retorno de valores de estado
• No pasar valores al procedimiento y capturar el valor de estado:declare @input int, @status intselect @input = 22exec @status = status_testselect @status
• Borrar los objetos de base de datos creados:drop proc status_test
![Page 88: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/88.jpg)
Rollbacks no intencionales
Proc2(Procedimiento aniddo)begin tran<statements...>if <error>
beginrollback
tranreturn
end<statements...>commit tranreturn
• Un rollback no intencional es un rollback anidado que sin intención deshace el trabajo en transacciones externas
Proc1(Transacción más externa)begin tran<statements...>if <error>
beginrollback tranreturn
endexec proc2if <error>
beginrollback tranreturn
end<statements...>commit tranreturn
![Page 89: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/89.jpg)
Savepoints y Rollbacks anidados
batch (Tran más externa)begin tran (1)<statements...>
exec proc1if <error>rollback tran (6)else commit tran
(1) Con begin tran inicia la transacción. Nivel anidamiento: 1.
(6) rollback deshace todas las sentencias en proc1, proc2, y batch-o-commit hace commit a todo.
• Usar savepoints para evitar rollbacks no deseados
proc 1save tran abc (2)<statements...>
exec proc2if <error>rollback tran abc (5)else ...
(2) save tran no incrementa el nivel de anidamiento.
(5) rollback regresa al punto abc. Entonces se ejecutan las subsiguientes sentencias en proc1.
proc 2
save tran xyz (3)<statements...>
if <error>rollback tran xyz(4)else ...
(3) save tran no incrementa el nivel de anidamiento.
(4) rollback regresa al punto xyz. Entonces se ejecutan las subsiguientes sentencias en proc2.
![Page 90: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/90.jpg)
create proc proc1asdeclare @ret_status int, @tran_flag intselect @tran_flag = @@trancount
if @tran_flag = 0 -- transaction has not begunbegin transaction proc1_tran
else -- transaction already initiated
-- nesting level begins or-- continues
save transaction proc1_tran
-- processing goes here
Plantilla para llamado de procedimientos
![Page 91: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/91.jpg)
if (something goes wrong, for example, @@error <> 0)begin
rollback tran proc1_tranreturn -999 -- you determine error number
end
exec @ret_status = proc2 -- Call procedure, begin nesting
if @ret_status = -999 -- Did called proc fail?begin -- to rollback or continue.
rollback tran proc1_tranreturn -999
end
if @tran_flag = 0 -- this proc executed begin tran commit tran proc1_tran
-- no need to commit with save tranreturn
Plantilla para llamado de procedimientos
![Page 92: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/92.jpg)
create procedure proc2asdeclare @ret_status int, @tran_flag intselect @tran_flag = @@trancount
if @tran_flag = 0 -- transaction has not begun begin transaction proc2_tran
else -- transaction already initiated
-- nesting level save transaction proc2_tran
-- processing goes here
Plantilla para llamado de procedimientos
![Page 93: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/93.jpg)
if (something goes wrong, for example, @@error <> 0)begin
rollback tran proc2_tranreturn -999 -- you determine error number
end
-- more processing if required
if @tran_flag = 0 -- this proc executed begin tran
commit tran proc2_tran-- no need to commit with save-- tran
return
Plantilla para llamado de procedimientos
![Page 94: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/94.jpg)
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 95: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/95.jpg)
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 96: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/96.jpg)
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 97: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/97.jpg)
• 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 98: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/98.jpg)
• 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 99: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/99.jpg)
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 100: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/100.jpg)
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 101: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/101.jpg)
![Page 102: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/102.jpg)
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 103: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/103.jpg)
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 104: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/104.jpg)
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 105: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/105.jpg)
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 106: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/106.jpg)
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 107: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/107.jpg)
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 108: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/108.jpg)
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 109: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/109.jpg)
Borrar Triggers
• Sintaxis simplificada:drop trigger trigger_name
• Ejemplo:drop trigger trg_i_sales
![Page 110: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/110.jpg)
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 111: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/111.jpg)
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 112: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/112.jpg)
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 113: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/113.jpg)
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 114: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/114.jpg)
Borrados
• A delete adds rows to the deleted table
![Page 115: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/115.jpg)
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 116: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/116.jpg)
Inserciones
• An insert adds rows to the inserted table
![Page 117: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/117.jpg)
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 118: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/118.jpg)
-- 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 119: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/119.jpg)
Actualizaciones
• An update adds rows to both tables
![Page 120: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/120.jpg)
-- 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 121: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/121.jpg)
-- 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 122: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/122.jpg)
-- 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 123: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/123.jpg)
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 124: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/124.jpg)
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 125: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/125.jpg)
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 126: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/126.jpg)
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 127: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/127.jpg)
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ón
Procedimiento almacenadoCaso 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 128: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/128.jpg)
• 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 129: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/129.jpg)
Procedimiento almacenadoCase C begin tran
...insert ...print "in sp"...commit tranprint "sp done"
Trigger........rollback triggerprint “tr done”return
Deshacer un trigger
![Page 130: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/130.jpg)
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 almacenadoCase E begin tran
...insert ...print "in sp"...commit tranprint "sp done"
Trigger........Rollback tranprint “tr done”return
Deshacer una transacción
![Page 131: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/131.jpg)
-- Book price can be updated if:-- 1) only one title is updated at a time-- 2) the update occurs during the work week-- 3) the price changes by 10% or less-- 4) only books with sales > 0 are updated
create trigger trg_u_titles on titlesfor update
asdeclare @num_rows intselect @num_rows = @@rowcountif @num_rows = 0
return
Triggers y rollbacks
![Page 132: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/132.jpg)
-- 1) only one title at a time
if @num_rows > 1 begin
rollback trigger with raiserror 20011"Can only update or add one title at a
time."return
end
-- 2) occurs during the work week
if (select datepart(dw, getdate())) in (1, 7)begin
rollback trigger with raiserror 20012
"Can only update price during work day."return
end
Triggers y rollbacks
![Page 133: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/133.jpg)
-- 3) the price changes by 10% or lessif (select new.price/old.price
from inserted new, deleted old)not between 1.10 and 0.90
beginrollback trigger with raiserror 20013 "Can only change price by 10 percent."return
end
-- 4) only books with sales > 0if (select isnull(total_sales, 0) from inserted) <= 0
beginrollback trigger with raiserror 20014 "Can only change price of book with sales."return
endreturn
go
Triggers y rollbacks
![Page 134: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/134.jpg)
Prácticas recomendadas al hacer Triggers
• Las siguientes consideraciones se deben hacer al elaborar triggers:– @@rowcount– if update– triggers anidados – triggers recursivos
![Page 135: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/135.jpg)
if update
• if update es una condición que le permite a un trigger chequear si ha habido un cambio en una determinada columna
• Sólo se puede usar en triggers• Usualmente se usa para chequear si el valor de una
llave primaria ha cambiado• Sintaxis simplificada:
if update (column_name) [ {and | or} update (column_name)]...
![Page 136: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/136.jpg)
-- Update trigger on publishers table
create trigger trg_u_publisherson publishers for updateas
-- Find out how many rows were modified
declare @num_rows intselect @num_rows=@@rowcount
if @num_rows=0return
if update
![Page 137: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/137.jpg)
if update ( pub_id ) -- Was primary key updated?begin
-- Multiple updated rows not allowed if @num_rows > 1
beginraiserror 31113 "Updates to primary keys of multiple rows is not permitted."rollback transactionreturn
end
-- Cascade update to titles table update titles
set t.pub_id = new.pub_idfrom titles t, inserted new, deleted oldwhere t.pub_id = old.pub_id
end
return
if update
![Page 138: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/138.jpg)
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 139: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/139.jpg)
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 140: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/140.jpg)
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 141: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/141.jpg)
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 142: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/142.jpg)
Ejemplo para mantener la integridad referencial de la llave foránea cuando se inserta o actualiza la tabla salesdetail:
Ejemplo
create trigger trg_iu_saleson salesdetailfor insert, update asdeclare @num_rows intselect @num_rows = @@rowcountif @num_rows = 0 return
if (select count (*) from titles t, inserted i where t.title_id = i.title_id) <> @num_rowsrollback transaction
if (select count (*) from sales s, inserted i where s.stor_id = i.stor_id and s.ord_num = i.ord_num) <> @num_rowsrollback transaction
return
create table salesdetail
(stor_id char(4) NOT NULL,
ord_num varchar(20) NOT NULL,
title_id typ_ch_tid NOT NULL
references titles(title_id),
qty smallint NOT NULL,
discount float NOT NULL,
constraint ref_salesdetforeign key (stor_id, ord_num)references sales (stor_id, ord_num) )
![Page 143: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/143.jpg)
Ejemplo para mantener la integridad referencial de la llave foránea cuando se inserta o actualiza la tabla salesdetail:
Ejemplo
create trigger trg_du_titleson titlesfor delete, update as-- prevent delete or update of -- title_id if there are foreign key-- values that reference them..return
create trigger trg_du_saleson salesfor delete, update as-- prevent delete or update of-- stor_id/ord_num if there are -- foreign key values that -- reference them...return
![Page 144: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/144.jpg)
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
![Page 145: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/145.jpg)
![Page 146: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/146.jpg)
Ambiente operacional del ASE
Sybase
masteruserdb model tempdb sybsystemprocs
$SYBASE/interfaces
$SYBASE/install/RUN_SYBASE
$SYBASE/sybase.cfg
2
4
5
3
/devices/datadev.dat $SYBASE/master.dat $SYBASE/sysprocs.dat
$SYBASE/charsets (dir)$SYBASE/locales (dir)
$SYBASE/install/errorlog
6 7 8 9
1
10
121113
![Page 147: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/147.jpg)
Configuración del servidor ASE
• Backup/recovery• Cache Manager• Disk I/O• Network• OS Resources• Memory• Processors• User environment• Lock Manager• Parallel query
Operating SystemOperating System
SYBASEMemory
Backup/Recovery
I/O Locking
Network
![Page 148: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/148.jpg)
Creación de bases de datos
mastermodel
sysindexes
syscolumns
sysobjects sysusagessysdatabases
... ...
user database
sysindexes
syscolumns
sysobjects
...
copies modelInserta información de las bases de datos en tablas del sistema
![Page 149: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/149.jpg)
Back-up y restauración de bases de datos
• Backup es el proceso de crear una copia de la base de datos• El backup puede ser de:
– Los datos y el registro de transacciones– Solamente del registro de transacciones
• Si hay una falla en los medios de almacenamiento, el backup se puede utilizar para restaurarla
• Restauración es el proceso de cargar los backups de datos y de registro de transacciones
![Page 150: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/150.jpg)
• dump database Para backup de toda la base de datos• dump transaction Para hacer backup del registro de
transacciones• Ejemplo:
• Después de una falla de la base de datos, se puede recuperar utilizando los respaldos de la base de datos total y de todos los registros de transacciones, procesados en el orden en el cual fueron creados
8 AM 9 AM 10 AM
Dump Database
Dump Tran 1
Dump Tran 2
Create/Load Database
Load Tran 1
Load Tran 2
10:30 AM
Back-up y restauración de bases de datos
![Page 151: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/151.jpg)
Copiado sucio (bulk copy)
• Bulk copy (bcp) es una utilidad para copiar rápidamente una tabla desde o hacia archivos del sistema operacional
• Bulk copy forza los defaults• Para mejorar el rendimiento:
– No se forzan las reglas– No se hace chequeo de restricciones referenciales– No se disparan los triggers
pubs.asc (ASCII file)
0736, New Age, Boston0877, Binnet, Washington1389, Algodata, Berkeley
0736 New Age Boston0877 Binnet Washington1389 Algodata Berkeley
0736 New Age Boston0877 Binnet Washington1389 Algodata Berkeley
pub_id pub_name citypub_id pub_name city
pubs2.dbo.publishers
![Page 152: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/152.jpg)
Bulk Copy: modos de velocidad
• Alta velocidad: Se ignoran índices y triggers • Normal: No se ignoran índices y triggers
– Los triggers se disparan, pero degradan el copiado– Dependiendo del tipo de índices puede ser más o menos
rápido• La opción select into/bulk copy/pllsort se debe
colocar en “on” para copiar a alta velocidad
![Page 153: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/153.jpg)
Seguridad de los datos
• Los servidores garantizan seguridad de datos:– Restringen el acceso al servidor– Restringen el acceso a los datos– Restringen las operaciones que se pueden hacer sobre los
datos– Mantiene un registro de auditoria que permite el seguimiento de
las acciones de los usuarios sobre los recursos
![Page 154: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/154.jpg)
Seguridad de datos: Clases de acceso
U2U2U1U1
U4U4
U3U3
Perm
isios
Logins
A nivel de base de datos
aliasalias dbo
Alias Usuarios Grupos
Vistas y procedimientos almacenados
Tablas
A nivel de objetos/comandos
GUESTGUEST
PUBL
ICLO
CHO
SLO
CHO
S
dbdb
PILO
SPI
LOS
L6L6
L7L7
L8L8
L9L9
L1L1
L2L2
L3L3
L4L4
L5L5
t1t1
t2t2
t3t3
t4t4
sp 1sp 1
sp 3sp 3sp 2sp 2
sp 4sp 4
viewview
![Page 155: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/155.jpg)
Logins
• Todos los clientes deben dar un nombre de cuenta (login) y palabra clave (password) válidos antes de ingresar al servidor o a las bases de datos
• Nombre de la cuenta (login)– Nombre asignado por el administrador del sistema al cual se le
asocia un método para validación (por ejemplo el password)– Debe corresponder a una sola persona– Se maneja a nivel del servidor
Usuario
Servidor - LoginServidor - Login
![Page 156: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/156.jpg)
Roles
• Tres tipos de roles en ASE:– SSO (System Security officer)
– OPER (Operator)
– SA (System Administrator)
• Después de instalado el ASE:– sa es la cuenta par administrar el servidor y no tiene
clave
– sa tiene los tres roles: SSO, OPER y SA
![Page 157: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/157.jpg)
Usuarios y grupos
• Usuario– Mediante un login puede acceder a una base de datos; allí
debe estar definido como un usuario de esa base de datos– Un usuario puede tener múltiples logins
• Grupo– Nombre asignado a un conjunto de usuarios de una base de
datos– Mecanismo que busca simplificar la administración
• Usuarios en grupos– Todos los usuarios son miembros del grupo public– Un usuario puede pertenecer sólo a otro grupo
![Page 158: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/158.jpg)
Rol DBO
• El DBO (database owner) es un usuario especial de la base de datos
• Típicamente, tiene un login asociado• El dbo puede:
– Añadir y borrar usuarios en la base de datos– Añadir y borrar groups en la base de datos– Ejecutar checkpoint manual– Ejecutar backups and restores de la base de datos– Despersonalizar otros usuarios en su base de datos– Cambiar las opciones de configuración de la base de datos– Ejecutar chequeos para hacer diagnósticos
![Page 159: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/159.jpg)
Rol guest
• Cada vez que se crea una nueva base de datos, la estructura inicial se copia de la base de datos model
• Por default, la base de datos model no tiene el usuario guest • Si se crea el usuario guest en la base de datos model, todas las
nuevas bases de datos creadas también lo tendrán• Todos los logins se tratan como un usuario guest en una base de
datos si:– Existe el usuario guest en esa base de datos– Los logins no están explícitamente asociados con un usuario de esa base
de datos• Los logins que se tratan como usuario guest, toman los permisos
que tenga definido el usuario guest
![Page 160: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/160.jpg)
El group public
• Todas las bases de datos tienen un grupo llamado public, el cual no se puede borrar
• Todos los usuarios siempre están asociados con el grupo public, aun si explícitamente están definidos en otro grupo
• Un usuario puede asociarse a un grupo, además del grupo public– La precedencia del conjunto de permisos está determinado
de forma cronológica
![Page 161: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/161.jpg)
Jerarquía de permisos
Administradores del SistemaAdministradores del Sistema
Database OwnersDatabase Owners
Otros UsuariosOtros Usuarios
Propietarios de Database ObjectsPropietarios de Database Objects
![Page 162: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/162.jpg)
Permisos sobre objetos y comandos• Permisos sobre objetos:
• Permisos sobre comandos:– create database– create default– create table– create view
• Todos los usuarios pueden crean tablas temporales
select, update Tabla, vista, columnasinsert, delete Tabla, vistareferences Tablaexecute Procedimiento almacenado
select, update Tabla, vista, columnasinsert, delete Tabla, vistareferences Tablaexecute Procedimiento almacenado
Comando ObjetoComando Objeto
![Page 163: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/163.jpg)
Commands and Object Permissions
StatementDefaults To Can Be
Granted/RevokedSystemAdmin Operator Database
OwnerObject Owner Yes No N/APublic
alter table
create database
create default
create index
create rule
Permisos (tabla parcial)
(1) public can create temporary tables, no permission required(2) If a view, permission defaults to view owner(3) Defaults to store procedure owner
No means use of the command is never restrictedN/A means use of the command is always restricted
![Page 164: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/164.jpg)
Permisos (tabla parcial)
(1) public can create temporary tables, no permission required(2) If a view, permission defaults to view owner(3) Defaults to store procedure owner
No means use of the command is never restrictedN/A means use of the command is always restricted
Commands and Object Permissions
StatementDefaults To Can Be
Granted/RevokedSystemAdmin Operator Database
OwnerObject Owner Yes No N/APublic
create table
create trigger
create view
delete
disk init
drop (any object)
(1) (1)
(2)
![Page 165: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/165.jpg)
Permisos (tabla parcial)
(1) public can create temporary tables, no permission required(2) If a view, permission defaults to view owner(3) Defaults to store procedure owner
No means use of the command is never restrictedN/A means use of the command is always restricted
Commands and Object Permissions
StatementDefaults To Can Be
Granted/RevokedSystemAdmin Operator Database
OwnerObject Owner Yes No N/APublic
dump database
dump transaction
execute (3)
grant on object
grant command
insert (2)
![Page 166: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/166.jpg)
Commands and Object Permissions
StatementDefaults To Can Be
Granted/RevokedSystemAdmin Operator Database
OwnerObject Owner Yes No N/APublic
load transaction
revoke on object
revoke command
select
set
update
(2)
(3)
Permisos (tabla parcial)
(1) public can create temporary tables, no permission required(2) If a view, permission defaults to view owner(3) Defaults to store procedure owner
No means use of the command is never restrictedN/A means use of the command is always restricted
![Page 167: Conceptos de Bases de Datos Relacionales Parte 3](https://reader034.vdocuments.mx/reader034/viewer/2022052410/5539bbb5550346cd028b49ab/html5/thumbnails/167.jpg)
Auditoria
• La auditoria permite registrar las actividades del sistema con el fin de detectar el accesos no autorizados o el mal uso de los recursos del sistema– Esas actividades se pueden grabar en una base de datos
• El sistema de auditoria, que se puede instalar en cualquier momento con auditinit, el cual consiste de:– Una base de datos llamada sybsecurity– Un conjunto de procedimientos almacenados– Un conjunto de variables de configuración para fijar las opciones de
auditoria
• Se puede auditar el servidor, una base de datos, un usuario y cualquier objeto de base de datos