Вы находитесь на странице: 1из 167

Conceptos de Bases de

Datos Relacionales
Parte 3
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
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 salesdetail
where 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
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
Comentarios

• Porción de código ignorado por el servidor


• Usados para documentar
• Dos formas:
 -- comentario hasta el final de una línea
 /* comentario */
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
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
Asignación con select y valores de tabla
• Sintaxis simplificada:
select variable_name = column_name
from table_name
[where condition]
• Ejemplos:
declare @AD_id char(11)
select @AD_id = au_id
from authors
where au_fname = "Ann" and au_lname = "Dull"

• Si el select retorna múltiples valores, solamente toma


el último
Asignación con update
• Sintaxis simplificada:
update table_name
set {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
Ejemplo

• Las variables se deben declarar antes de usarlas


• Ejemplo:
select pub_id
from publishers
select @myvar = total_sales
from titles
where title_id = "BU2075"
select @myvar

Server Message: Number 137, Severity 15


Line 3:
Must declare variable '@myvar'.
Ejemplo
• Los valores de las variables deben de concordar con
el tipo de dato de la variable
• Ejemplo:
declare @myvariable int

select @myvariable = title


from titles
where title_id = "BU2075"
select @myvariable

Server Message: Number 257, Severity 16


Line 2:
Implicit conversion from datatype 'VARCHAR' to
'INT' is not allowed. Use the CONVERT function to
run this query.
Ejemplo
• Si el select no retorna valores, la variable no cambia
• Ejemplo:
declare @value int
select @value = total_sales from titles
where title_id = "BU2075"
select @value as "BU2075 sales"
select @value = total_sales from titles
where title_id = "BU11" -- should be "BU1111"
select @value as "BU1111 sales"

Primer query: Segundo query:


BU2075 sales BU1111 sales
------------ ------------
18722 18722
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..publishers
where pub_name = "New Age Books"

-- View the variable’s value:


select @pub_var
--- Use the variable in a select statement:
select title_id, title, pub_id
from pubs2..titles
where pub_id = @pub_var

- Execute the batch. (Users of SQL Advantage do


-- not need to enter "go" to complete this step):
go
Variables globales

• Variable global: nombre de una posición de


memoria para almacenar un valor definido y
mantenido por el servidor
Ejemplo

• Ejemplo:
delete from titles
where type = "popular_comp"
select @@rowcount

------
3
Ejemplo

• Ejemplo:
delete from titles
where type = "popular_comp"
select @@error

------
0
Ejemplo

• Ejemplo:
-- The word "from" is misplaced
delete titles from
where type = "psychology"

Server Message: Number 156, Severity 15


Line 4:
Incorrect syntax near the keyword 'where'.

select @@error

------
156
Ejemplo
• Crear una tabla:
select * into mytitles
from pubs2..titles

• Intentar borrar una tabla inexistente @@error:


delete from no_table
select @@error

• Ejecutar un delete con una condición que nunca se


cumple:
delete from mytitles
where 1 = 2
select @@error
• ¿El segundo delete genera un error? ¿Por qué o por
qué no?

• Borrar los objetos de bases de datos creados:


drop table mytitles
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
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."
Condiciones anidadas
• Ejemplo:
delete from titles
where type = "mod_cook"
if @@rowcount = 0
select "No rows were deleted."
else
if @@rowcount = 1
select "One row was deleted."
else
select "Multiple rows were
deleted."
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
else
begin
select "Title has already been deleted"
end
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
else
select "All titles priced under $50.00"
Ejemplo
• Ejemplo:
if exists (select * from sysobjects
where name = "vw_utah_authors"
and type = "V")
drop view vw_utah_authors
go
create view vw_utah_authors
as
select * from authors
where state = "UT"
with check option
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
while
• Sintaxis:
while condition
block_to_execute
• Ejemplo:
while (select avg(price) from titles) < $40
begin
update titles
set price = price + $2
end
Ejemplo

• Ejemplo:
declare @price money
select @price = price
from titles
where title_id = "PS1372"
while @price < $30
begin
update titles
set price = price * $1.10
where 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.
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) > $20


begin
update titles
set price = price / 2
if (select max(price) from titles) < $40
break
end
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
begin
select @price = @price + $1.00
if (select count(price) from titles
where price = @price) >= 5
continue
else
update titles
set price = price * $1.10
where price = @price
end
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 money
select @avg_price = avg(price) from titles
if @avg_price < $10
return
while @avg_price < $20
begin
update titles
set price = price * $0.95
select @avg_price = avg(price) from
titles
end
Ciclos while

• Ejemplo:
declare @x money
select @x = $0
while @x < (select max(price) from
pubs2..titles)
begin
select @x = @x + $1
select "Titles less than $", @x
select price, title
from pubs2..titles
where price < @x
end
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
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
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
Interactive Execution
Creación de un procedimiento almacenado
Ejecución de un procedimiento almacenado
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
Crear y borrar procedimientos almacenados
• Sintaxis simplificada para create:
create proc procedure_name
as
statements
return
• Ejemplo:
create proc proc_update_titles
as
update titles
set price = price * $0.95
where total_sales < 3000
return
• Sintaxis simplificada para drop:
drop proc procedure_name
• Ejemplo:
drop proc proc_update_titles
Ejecutar procedimientos almacenados

• Sintaxis simplificada:
[exec | execute] procedure_name
• Ejemplo:
execute proc_update_titles
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_titles
as
declare @max_sales int, @half_max real
select @max_sales = max(total_sales)
from titles
select @half_max = @max_sales / 2
select title, total_sales from titles
where total_sales < @half_max
update titles
set price = price * $0.95
where total_sales < @half_max
return
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
Procedimientos almacenados y permisos
• Para permitir que otros usen un procedimiento
almacenado, el propietario debe dar los respectivos
permisos
• Sintaxis simplificada:
grant execute
on procedure_name
to user_list
• Ejemplo:
grant execute
on proc_update_titles
to tjovanka, vturlough, pbrown
Crear procedimientos almacenados

• Crear un procedimiento almacenado sencillo:


create proc proc_hello
as
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
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
Definir parámetros de entrada
• Sintaxis simplificada:
create procedure procedure_name
(parameter_name datatype default_value
[, parameter_name datatype default_value...] )
as
statements
return
• Ejemplo:
create proc proc_author_info
(@lname varchar(40), @fname varchar(20))
as
-- lists the author and his or her books
select au_lname, au_fname, title
from authors, titles, titleauthor
where au_fname = @fname
and au_lname = @lname
and authors.au_id = titleauthor.au_id
and titles.title_id = titleauthor.title_id
return
Pasar parámetros

• Dos métodos para pasar valores a parámetros:


– Paso de parámetros por posición
– Paso de parámetros por nombre
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
Paso de parámetros por nombre
• Sintaxis para paso por nombre:
[exec | execute] procedure procedure_name
parameter_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
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, state
from authors
where state = @state
return

exec proc_state_authors -- No state value passed

au_lname au_fname state


-------- -------- -----
White Johnson CA
Green Marjorie CA
...
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
Parámetros de entrada: Ejemplo
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 <> 0
begin
rollback transaction
raiserror 24001 "Transaction failed"
return
end
commit transaction
return
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!", @name
return
• Ejecutar el procedimiento con y sin un valor para el parámetro
de entrada. Una sentencia fallará:
exec proc_hello_param
exec proc_hello_param "<yourname>"
• Crear un procedimiento almacenado que tiene un valor por
default para un parámetro de entrada:
create proc proc_hello_def
(@name varchar(30) = "whoever you are")
as
print "Hello %1!", @name
return
Parámetros de entrada

• Ejecutar el procedimiento con y sin un valor para el


parámetro de entrada:
exec proc_hello_def
exec 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
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
Crear parámetros que retornan valores
• Sintaxis simplificada:
create procedure procedure_name
(parameter_name datatype output
[, parameter_name datatype output...] )
as
statements
return
• Ejemplo:
create proc proc_new_price
(@title_id char(6),
@new_price money output)
as
select @new_price = price
from titles
where title_id = @title_id
select @new_price = @new_price * $1.15
return
Usar parámetros que retornan valores
• Sintaxis simplificada:
[exec | execute] procedure_name variable output
• Ejemplo:
declare @my_title char(6), @my_price money
select @my_title = "PC8888"
exec proc_new_price
@my_title, @my_price output

----------
23.00

• Los valores que retornan los 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
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.
Retorno de parámetros: Ejemplo

• Programa batch :
declare @qty_ordered int,
@actual_qty int,
@item_ordered char(10)
select @qty_ordered = 50
select @actual_qty = @qty_ordered
select @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)
Retorno de parámetros: Ejemplo
• Procedimiento proc_dec_inventory :
create proc proc_dec_inventory
(@item_ordered char(10),
@actual_qty int output)
as
declare @qty_stock int,
@back_order int
select @back_order = 0
if not exists (select * from inventory
where item = @item_ordered)
begin
raiserror 20010 "Item not listed."
return
end
select @qty_stock=stock from inventory
where item = @item_ordered
Retorno de parámetros: Ejemplo

if @qty_stock < @actual_qty


select @back_order = @actual_qty - @qty_stock,
@actual_qty = @qty_stock
update inventory
set stock = stock - @actual_qty,
backordered_qty = @back_order +
backordered_qty
where @item_ordered = item
return
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)
as
print "Hello %1!", @name
if @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
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
Legibilidad - ejemplo
create 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
Legibilidad - ejemplo
** 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
** 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

** 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

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 -500
end

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
if exists (select * from titles where title_id=@tid)
and exists (select 1 from authors where au_id =@aid)
begin
insert titleauthor values(@aid,@tid,@au_ord,@royal)
if @@error <> 0
begin
rollback transaction
raiserror 21005 "Insertion into titleauthor
failed. Transaction failed."
return -200
end
end
else /* Referential Integrity check failed. */
begin
rollback transaction
raiserror 30020 "title_id or au_id not valid"
return -405
end
commit transaction
return
go
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
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)
as
if @title_id is NULL or @max_price is NULL
begin
raiserror 20001
"Execution for this procedure is:
exec proc_cutoff title_id, max_price"
return
end
...
return
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
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
Rótulos de modo de transacción

• Fijar modo chained:


set chained on
• Crear un procedimiento sencillo:
create proc tagtest
as
print "Tag test"
return
• Fijar modo unchained:
set chained off
• Ejecutar el procedimiento:
exec tagtest
• ¿Qué clase de error resulta?
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
Retorno de valores de estado

• A return status is a value that indicates


whether or not the procedure successfully
completed
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
Retorno de valores de estado
• Sintaxis simplificada:
create proc procedure_name
as
statements
return [return_status]
• Ejemplo:
create proc proc_datacheck
as
if (select max(total_sales) from titles) < 3000
begin
print "All the books have sold
less than 3000."
return 100
end
else
...
return 0
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 int
exec @status = proc_datacheck
if @status = 100
exec proc_max_under_3000
else
print "proc_datacheck was successful"
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) like
upper(@lname)+"%")
return -900
--error status
select au_id, au_fname, au_lname, phone,
address, city, state, postalcode
from authors
where upper(au_lname) like upper(@lname)+"%"
return 0
-- successful execution of proc
-- ‘0’ is returned if no other value specified
Retorno de valores de estado -Ejemplo
• Calling program that checks the return status:
-- ret_status: local variable to hold return status
declare @ret_status int
exec @ret_status = proc_author_addr @lname="tr"
if @ret_status <> 0
begin -- Error handling code here
print "Error finding name."
return
end
else
begin
print "Name was found."
end

Returned by Server: (return status = -900)


Error finding name.
Retorno de valores de estado
• Crear un procedimiento sencillo:
create proc status_test (@value int)
as
if @value < 10
return 50
return 70
• Dar el valor “5” y capturar el valor de retorno:
declare @input int, @status int
select @input = 5
exec @status = status_test @input
select @status
• Dar el valor “22” y capturar el valor de retorno:
declare @input int, @status int
select @input = 22
exec @status = status_test @input
select @status
Retorno de valores de estado

• No pasar valores al procedimiento y capturar el valor de


estado:
declare @input int, @status int
select @input = 22
exec @status = status_test
select @status
• Borrar los objetos de base de datos creados:
drop proc status_test
Rollbacks no intencionales
• 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...> Proc2(Procedimiento aniddo)
if <error>
begin begin tran
rollback tran <statements...>
return if <error>
end begin
exec proc2 rollback tran
if <error> return
begin end
rollback tran <statements...>
return commit tran
end return
<statements...>
commit tran
return
Savepoints y Rollbacks anidados
• Usar savepoints para evitar rollbacks no deseados
batch (Tran más externa) proc 1 proc 2
begin tran (1) save tran xyz (3)
<statements...> save tran abc (2)
<statements...> <statements...>
exec proc1
if <error> exec proc2
if <error> if <error>
rollback tran (6)
else commit tran rollback tran abc (5) rollback tran xyz(4)
else ... else ...
(1) Con begin tran
inicia la transacción. (2) save tran no (3) save tran no
Nivel anidamiento: 1. incrementa el nivel de incrementa el nivel de
anidamiento. anidamiento.

(6) rollback deshace (5) rollback regresa al (4) rollback regresa al


todas las sentencias punto abc. Entonces se punto xyz. Entonces se
en proc1, proc2, y ejecutan las ejecutan las
batch subsiguientes sentencias subsiguientes
-o- en proc1. sentencias en proc2.
commit hace commit
a todo.
Plantilla para llamado de procedimientos
create proc proc1
as
declare @ret_status int, @tran_flag int
select @tran_flag = @@trancount

if @tran_flag = 0 -- transaction has not begun


begin transaction proc1_tran
else -- transaction already
initiated
-- nesting level begins or
-- continues
save transaction proc1_tran

-- processing goes here


Plantilla para llamado de procedimientos
if (something goes wrong, for example, @@error <> 0)
begin
rollback tran proc1_tran
return -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_tran
return -999
end

if @tran_flag = 0 -- this proc executed begin tran


commit tran proc1_tran
-- no need to commit with save tran
return
Plantilla para llamado de procedimientos

create procedure proc2


as
declare @ret_status int, @tran_flag int
select @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

if (something goes wrong, for example, @@error <> 0)


begin
rollback tran proc2_tran
return -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
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
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
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
Crear procedimientos con recompile

• 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_name
with recompile
as
statements
return
Crear procedimientos con recompile

• Ejemplo:
create proc proc_list_California_authors
(@early_name varchar(80), @late_name
varchar(80))
with recompile
as
select au_id, au_lname, au_fname
from authors
where au_lname between @early_name and
@late_name
and state = "CA"
order by au_lname
return
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
sp_recompile

• sp_recompile hace que cada procedimiento


almacenado (y trigger) que utilice la tabla indicada
se recompile la siguiente vez que él se ejecute
• Sintaxis:
sp_recompile table_name
• Ejemplo:
sp_recompile authors
Trigger
• Un trigger es un procedimiento almacenado asociado
con una tabla, el cual se ejecuta automáticamente
cuando se modifica un dato de esa tabla

Can It Be Can It Be Can It Use


Explicitly Executed Parameters?
Called? Automatically?
User-Defined Yes No Yes
Stored
Procedure
Trigger No Yes No
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
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
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
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
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
Crear triggers
• Sintaxis simplificada:
create trigger trigger_name
on table_name
for {insert | update | delete} [, {insert | update | delete} ...]
as
sql_statements
• Ejemplo:
create trigger trg_i_sales
on sales
for insert
as
if datename (dd,getdate()) = "Sun"
begin
raiserror 40070, "Sales cannot be
processed on Sunday."
rollback trigger
end
Borrar Triggers

• Sintaxis simplificada:
drop trigger trigger_name
• Ejemplo:
drop trigger trg_i_sales
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
Triggers - ejemplo
• Crear dos tablas:
select * into myauthors
from pubs2..authors
create 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_myauthors
on myauthors
for delete
as
insert into myrecord
values (getdate(), @@rowcount)
return
Triggers - ejemplo

• Ejecutar un delete y ver la tabla myrecords:


delete from myauthors
where state = "CA"
select * from myrecord
• Ejecutar un delete que no afecta filas y ver la tabla
myrecords :
delete from myauthors
where 1 = 2
select * from myrecord
• Borrar los objetos de base de datos creados:
drop table myauthors, myrecord
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
Borrados

• A delete adds rows to the deleted table


Uso de la tabla deleted - ejemplo
create trigger trg_d_publishers
on publishers
for delete
as
-- Exit trigger if no rows were modified.
if @@rowcount = 0
return

-- For deleted publishers, delete


-- corresponding titles
delete titles
from titles t, deleted d
where t.pub_id = d.pub_id
-- Appropriate actions would take place here
-- since a deleted publisher has far-reaching
-- effects throughout the database.
return
Inserciones

• An insert adds rows to the inserted table


Uso de la tabla inserted - ejemplo

-- Make sure all au_ids match


if (select count(*) from authors a, inserted i
where a.au_id=i.au_id ) <> @num_rows
begin
raiserror 31114 "Attempt to insert
invalid au_id into titleauthor."
rollback transaction
return
end
return
go
Uso de la tabla inserted - ejemplo
-- Insert and update trigger on titleauthor
create trigger trg_iu_titleauthor
on titleauthor
for insert, update as
-- Find out how many rows were modified
declare @num_rows int
select @num_rows=@@rowcount
if @num_rows=0
return
-- Make sure all title_ids match
if (select count(*) from titles t, inserted i
where t.title_id=i.title_id) <> @num_rows
begin
raiserror 31113 "Attempt to insert
invalid title_id into titleauthor."
rollback transaction
return
end
Actualizaciones

• An update adds rows to both tables


Uso de las tablas inserted y deleted

-- Insert, update, and delete trigger on salesdetail


create trigger trig_iud_salesdetail
on salesdetail
for insert, update, delete
as

-- Exit trigger if no rows were modified.


if @@rowcount = 0
return
Uso de las tablas inserted y deleted

-- 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 titles
set total_sales = isnull(total_sales, 0) +
(select sum(qty)
from inserted
where titles.title_id = inserted.title_id)
where title_id in (select title_id from inserted)
Uso de las tablas inserted y deleted

-- 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 titles
set total_sales = isnull(total_sales, 0) -
(select sum(qty)
from deleted
where titles.title_id = deleted.title_id)
where title_id in (select title_id from deleted)

return
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
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_myauthors
on myauthors
for delete
as
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"
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
Triggers y rollbacks

• Tres tipos de rollbacks:


– Deshacer el trigger
– Deshacer el trigger y la sentencia que lo disparó
– Deshacer toda la transacción
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 almacenado Trigger
Caso A begin tran
... save tran s1
insert ... ....
print "in sp" rollback tran s1
... print “tr done”
commit tran return
print "sp done"

Procedimiento almacenado
Caso B begin tran
... Trigger
(este caso insert ... begin tran s2
ocaciona un print "in sp" ....
error) ... rollback tran s2
commit tran print “tr done”
print "sp done" return
Deshacer un trigger
• rollback trigger deshace el trigger y la sentencia que lo
disparó
• Sintaxis:
rollback trigger [with raiserror error_number [error_statement] ]
• Ejemplo:
create trigger trg_i_publishers
on publishers
for insert
as
if @@rowcount > 1
begin
rollback trigger with raiserror 40031
"You cannot insert more than one
publisher at a time."
return
end
Deshacer un trigger

Procedimiento almacenado
Case C begin tran
Trigger
... ....
insert ... ....
print "in sp" rollback trigger
... print “tr done”
commit tran return
print "sp done"
Deshacer una transacción
• Para deshacer toda la transacción donde está inmerso el trigger,
ejecutar un rollback sin un punto de grabación
Procedimiento almacenado
Case D begin tran
Trigger
... begin tran
insert ... ...
print "in sp" rollback tran
... print "tr done”
commit tran return
print "sp done"

Procedimiento almacenado
Case E begin tran Trigger
....
...
....
insert ...
Rollback tran
print "in sp"
print “tr done”
...
return
commit tran
print "sp done"
Triggers y rollbacks
-- 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 titles


for update
as
declare @num_rows int
select @num_rows = @@rowcount
if @num_rows = 0
return
Triggers y rollbacks
-- 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
-- 3) the price changes by 10% or less
if (select new.price/old.price
from inserted new, deleted old)
not between 1.10 and 0.90
begin
rollback trigger with raiserror 20013
"Can only change price by 10 percent."
return
end

-- 4) only books with sales > 0


if (select isnull(total_sales, 0) from inserted) <= 0
begin
rollback trigger with raiserror 20014
"Can only change price of book with sales."
return
end
return
go
Prácticas recomendadas al hacer Triggers

• Las siguientes consideraciones se deben hacer al


elaborar triggers:
– @@rowcount
– if update
– triggers anidados
– triggers recursivos
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)]...
if update

-- Update trigger on publishers table

create trigger trg_u_publishers


on publishers
for update
as

-- Find out how many rows were modified

declare @num_rows int


select @num_rows=@@rowcount

if @num_rows=0
return
if update
if update ( pub_id ) -- Was primary key updated?
begin
-- Multiple updated rows not allowed
if @num_rows > 1
begin
raiserror 31113 "Updates to primary
keys of multiple rows is not permitted."
rollback transaction
return
end

-- Cascade update to titles table


update titles
set t.pub_id = new.pub_id
from titles t, inserted new, deleted old
where t.pub_id = old.pub_id
end
return
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
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
Métodos para integridad de datos

• Dos métodos para implementar integridad de datos

Domain Entity Integrity Referential


Integrity Integrity

Constraints Check Primary key References


constraints constraints, constraints
unique
constraints
Database Rules Indexes Triggers
Objects
Actualización de valores llave
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

*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
Ejemplo
Ejemplo para mantener la integridad referencial de la llave foránea
cuando se inserta o actualiza la tabla salesdetail:
create trigger trg_iu_sales create table salesdetail
on salesdetail (stor_id char(4) NOT NULL,
for insert, update as ord_num varchar(20) NOT NULL,
declare @num_rows int title_id typ_ch_tid NOT NULL
select @num_rows = @@rowcount references titles(title_id),
if @num_rows = 0
qty smallint NOT NULL,
return
discount float NOT NULL,
if (select count (*)
from titles t, inserted i
where t.title_id = i.title_id) constraint ref_salesdet
foreign key (stor_id, ord_num)
<> @num_rows
references sales
rollback transaction (stor_id, ord_num) )
if (select count (*) from
sales s, inserted i
where s.stor_id = i.stor_id
and s.ord_num = i.ord_num)
<> @num_rows
rollback transaction
return
Ejemplo
Ejemplo para mantener la integridad referencial de la llave foránea
cuando se inserta o actualiza la tabla salesdetail:
create trigger trg_du_titles
on titles
for delete, update as
-- prevent delete or update of
-- title_id if there are foreign key
-- values that reference them
..
return

create trigger trg_du_sales


on sales
for delete, update as
-- prevent delete or update of
-- stor_id/ord_num if there are
-- foreign key values that
-- reference them
...
return
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
Ambiente operacional del ASE
$SYBASE/interfaces
2 3
Sybase $SYBASE/install/errorlog
1
$SYBASE/install/ $SYBASE/charsets (dir)
RUN_SYBASE $SYBASE/locales (dir)
4
10 6 7 8 9

$SYBASE/sybase.cfg userdb master model tempdb sybsystemprocs


13 11 12

/devices/datadev.dat $SYBASE/master.dat $SYBASE/sysprocs.dat


Configuración del servidor ASE
• Backup/recovery
• Cache Manager SYBASE
Memory
• Disk I/O
• Network Network
• OS Resources Backup/Recovery
• Memory Operating System
• Processors
• User environment
• Lock Manager
I/O Locking
• Parallel query
Creación de bases de datos
model master

sysobjects sysindexes sysdatabases sysusages


... ...
syscolumns
copies model
Inserta
sysobjects sysindexes
información
user database ... de las bases
de datos en
syscolumns
tablas del
sistema
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
Back-up y restauración de bases de datos
• dump database Para backup de toda la base de datos
• dump transaction Para hacer backup del registro de
transacciones
• Ejemplo:
10:30 AM
8 AM 9 AM 10 AM

Dump Dump Dump Create/Load Load Load


Database Tran 1 Tran 2 Database Tran 1 Tran 2

• 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
Copiado sucio (bulk copy)
pubs2.dbo.publishers
pubs.asc (ASCII file)
pub_id pub_name city
0736, New Age, Boston 0736 New Age Boston
0877, Binnet, Washington 0877 Binnet Washington
1389, Algodata, Berkeley 1389 Algodata Berkeley

• 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
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
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
Seguridad de datos: Clases de acceso
A nivel de base de datos A nivel de objetos/comandos
L1

PUBLIC
GUEST t1
L2
view t2
L3 U1

Permisios
PILOS
L4 U2 sp 1 t3
L5 U3
sp 2
L6 U4 sp 3 t4
L7
alias LOCHOS sp 4
alias dbo
L8
L9 db Vistas y Tablas
procedimientos
Logins Alias Usuarios Grupos almacenados
Logins
Usuario

Servidor - Login

• 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
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
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
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
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
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
Jerarquía de permisos

Administradores del Sistema

Database Owners

Propietarios de Database Objects

Otros Usuarios
Permisos sobre objetos y comandos
• Permisos sobre objetos:

Comando Objeto
select, update Tabla, vista, columnas
insert, delete Tabla, vista
references Tabla
execute Procedimiento almacenado

• Permisos sobre comandos:


– create database
– create default
– create table
– create view
• Todos los usuarios pueden crean tablas temporales
Permisos (tabla parcial)
Commands and Object Permissions
Can Be
Defaults To Granted/Revoked
Statement System Database Object
Operator Public Yes No N/A
Admin Owner Owner
alter table
create database
create default
create index
create rule

(1) public can create temporary tables, no permission required No means use of the command is never
restricted
(2) If a view, permission defaults to view owner N/A means use of the command is always
(3) Defaults to store procedure owner restricted
Permisos (tabla parcial)
Commands and Object Permissions
Can Be
Defaults To Granted/Revoked
Statement System Database Object
Operator Public Yes No N/A
Admin Owner Owner
create table (1) (1)
create trigger
create view
delete (2)
disk init
drop (any object)

(1) public can create temporary tables, no permission required No means use of the command is never
restricted
(2) If a view, permission defaults to view owner N/A means use of the command is always
(3) Defaults to store procedure owner restricted
Permisos (tabla parcial)
Commands and Object Permissions
Can Be
Defaults To Granted/Revoked
Statement System Database Object
Operator Public Yes No N/A
Admin Owner Owner
dump database
dump transaction
execute (3)
grant on object
grant command
insert (2)

(1) public can create temporary tables, no permission required No means use of the command is never
restricted
(2) If a view, permission defaults to view owner N/A means use of the command is always
(3) Defaults to store procedure owner restricted
Permisos (tabla parcial)
Commands and Object Permissions
Can Be
Defaults To Granted/Revoked
Statement System Database Object
Operator Public Yes No N/A
Admin Owner Owner
load transaction
print
revoke on object
revoke command
select (2)
set
update (3)
(1) public can create temporary tables, no permission required No means use of the command is never
restricted
(2) If a view, permission defaults to view owner N/A means use of the command is always
(3) Defaults to store procedure owner restricted
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

Вам также может понравиться