You are on page 1of 167

Conceptos de Bases de

Datos Relacionales
Parte 3

Ambiente de ejecucin
El cdigo se puede ejecutar en:
Cliente
Servidor

Ventajas de programar en el lado cliente

Atiende usuarios finales con diferentes necesidades


Evita trfico en la red
Se distribuye una parte del procesamiento
Puede facilitar la interaccin del usuario

Ventajas de programar en el lado servidor

Se tiene concentracin de los recursos


Uniformiza la aplicacin de las reglas del negocio
Se puede actualizar ms fcilmente el cdigo

Batch
Una o ms 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
Porcin de cdigo ignorado por el servidor
Usados para documentar
Dos formas:

-- comentario hasta el final de una lnea


/* comentario */

Variables locales

Variable local: nombre de una posicin de memoria para


almacenar un valor
Uso tpico de las variables locales

Para facilitar el uso repetido de valores constantes


Para ejecutar bifurcamiento en cdigo SQL
Para capturar mensajes que contienen informacin variable
Para intercambio de informacin con stored procedures
Para evitar el uso de subquerys

Asignacin 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

Asignacin 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 mltiples valores, solamente toma


el ltimo

Asignacin 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 mltiples 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:
Line 3:

Number

137, Severity

Must declare variable '@myvar'.

15

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:
BU2075 sales
-----------18722

Segundo query:
BU1111 sales
-----------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 variables 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 posicin 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 condicin 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 combinacin

Procedimientos almacenados
Un procedimiento almacenado es un conjunto de sentencias
SQL y de control de flujo
Beneficios de los procedimientos almacenados:

Simplifican la ejecucin de tareas repetitivas


Corren ms rpido que las mismas instrucciones ejecutadas en
forma interactiva
Reducen el trfico a travs de la red
Pueden capturar errores antes que ellos puedan entrar a la base de
datos
Establece consistencia porque ejecuta las tareas de la misma
forma
Permite el desarrollo modular de aplicaciones
Ayuda a proveer seguridad
Puede forzar reglas y defaults complejos de los negocios

Tipos de procedimientos almacenados


Procedimientos almacenados definidos por el usuario
Son procedimientos definidos por el usuario que se
deben llamar explcitamente

Triggers

Son procedimientos definidos por el usuario que se


ejecutan automticamente 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

Creacin de un procedimiento almacenado

Ejecucin de un procedimiento almacenado

Ventajas en el rendimiento
Un procedimiento almacenado se ejecuta ms rpido que un
batch porque:
El procedimiento almacenado ya ha sido analizado
Ya se han resuelto las referencias a los objetos
referenciados en el procedimiento almacenado
No se necesita construir el rbol de bsqueda, l usa el que
se hace en el momento de compilarlo
No se necesita crear un plan de bsqueda, porque ya el
procedimiento tiene uno

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 slo existen mientras exista el procedimiento
Las variables no las puede usar otro proceso

Ejemplo:
create proc proc_update_under_half_titles
as
declare @max_sales int, @half_max real
select @max_sales = max(total_sales)
from titles
select @half_max = @max_sales / 2
select title, total_sales from titles
where total_sales < @half_max
update titles
set price = price * $0.95
where total_sales < @half_max
return

Sentencias vlidas e invlidas


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

Parmetros de entrada
An input Parmetro is a variable local to a
procedimiento almacenado that can receive
a value from the exec procedure Sentencia

Definir parmetros 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 parmetros
Dos mtodos para pasar valores a parmetros:
Paso de parmetros por posicin
Paso de parmetros por nombre

Paso de parmetros por posicin


Sintaxis para paso por posicin:

[exec | execute] procedure_name value [, value...]

Ejemplo:
exec proc_author_info "Ringer", "Albert"
au_lname
-------Ringer
Ringer

au_fname
-------Albert
Albert

title
-----

Is Anger the Enemy?


Life Without Fear

Los parmetros se deben pasar en el mismo orden en que


ellos aparecen en la sentencia create procedure
Como este mtodo es ms propenso a errores, se aconseja
el paso por nombre

Paso de parmetros 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
-------Ringer
Ringer

au_fname
-------Albert
Albert

title
----Is Anger the Enemy?
Life Without Fear

Los nombres de los parmetros en la sentencia exec deben


concordar con los nombres de los parmetros usados en la
sentencia create procedure
Los parmetros pueden pasar en cualquier orden

Valores por default


Se puede asignar un valor por default a un parmetro 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
-------White
Green
...

state
----CA
CA

au_fname
-------Johnson
Marjorie

Parmetros de entrada: errores comunes


Los valores que se pasan no tienen el mismo tipo de datos
que los parmetros definidos
En la misma sentencia, se pasa un parmetro por posicin
despus de haber pasado un parmetro por nombre
Aunque no es recomendado, es posible mezclar los dos mtodos
para pasar valores, sin embargo, despus de pasar un valor a un
parmetro por nombre, todos los restantes de deben pasar por
nombre

Olvido de uno o ms parmetros


El olvido de uno o ms valores para los parmetros, hace que se
usen los valores por default

Los valores para los parmetros se pasan en un orden errado

Parmetros 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

Parmetros de entrada
Crear un procedimiento almacenado que tenga un parmetro de
entrada:
create proc proc_hello_param (@name varchar(30))
as
print "Hello %1!", @name
return

Ejecutar el procedimiento con y sin un valor para el parmetro


de entrada. Una sentencia fallar:
exec proc_hello_param
exec proc_hello_param "<yourname>"

Crear un procedimiento almacenado que tiene un valor por


default para un parmetro de entrada:
create proc proc_hello_def
(@name varchar(30) = "whoever you are")
as
print "Hello %1!", @name
return

Parmetros de entrada
Ejecutar el procedimiento con y sin un valor para el
parmetro de entrada:
exec proc_hello_def
exec proc_hello_def "<yourname>"

Cul procedimiento almacenado parece ser ms amigable?


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

Retorno de valores
A return Parmetro is a variable local to a
procedimiento almacenado that can send a
value to the exec procedure Sentencia

Crear parmetros 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 parmetros 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 parmetros se pasan


automticamente al conjunto respuesta
El retorno de valores se pueden pasar por nombre o por
posicin
Se recomienda el paso por nombre

Retorno de parmetros: 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 haba existencias, el valor
retornado es igual a cero.

Retorno de parmetros: 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 parmetros: 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 parmetros: 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 parmetros - Ejemplo


Crear un procedimiento almacenado que tiene un parmetro
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 cdigo ms legible:
Utilizar comentarios
Utilizar indentacin
Usar espacios en blanco y dejar el cdigo
organizado en columnas
Declarar e iniciar las variables en un bloque

Establecer un conjunto de buenas prcticas


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 database. Sets default parameter values as required for
error checking and usage confirmation. Verifies referential 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


parmetros de entrada
El servidor slo chequea que los valores y sus respectivos parmetros
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 omisin de


valores para los parmetros
Si un procedimiento almacenado requiere valores para los parmetros, 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

Rtulos de modo de transaccin


Los procedimientos almacenados se rotulan con el modo
de transaccin con el cual fueron creados
No se puede ejecutar una transaccin en un modo diferente al del
rtulo

sp_procxmode
sp_procxmode permite ver y cambiar el modo de transaccin de un
procedimiento

Sintaxis:

sp_procxmode [ procedure_name [ , {chained | unchained | anymode} ] ]

Ejemplo:
sp_procxmode proc_update_titles, unchained

Rtulos de modo de transaccin


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?

Rtulos de modo de transaccin


Cambiar el rtulo del modo de transaccin:
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

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 authors address and to
-- determine if an author exists. Returns -900 if
-- the authors 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 intencin
deshace el trabajo en transacciones externas
Proc1(Transaccin ms externa)
begin tran
<statements...>
if <error>
begin
rollback tran
return
end
exec proc2
if <error>
begin
rollback tran
return
end
<statements...>
commit tran
return

Proc2(Procedimiento aniddo)
begin tran
<statements...>
if <error>
begin
rollback tran
return
end
<statements...>
commit tran
return

Savepoints y Rollbacks anidados


Usar savepoints para evitar rollbacks no deseados
batch (Tran ms externa)
begin tran (1)
<statements...>
exec proc1
if <error>
rollback tran (6)
else commit tran

(1) Con begin tran


inicia la transaccin.
Nivel anidamiento: 1.

(6) rollback deshace


todas las sentencias en
proc1, proc2, y batch
-ocommit hace commit a
todo.

proc 1

proc 2

save tran abc (2)


<statements...>
exec proc2
if <error>
rollback tran abc (5)
else ...

save tran xyz (3)


<statements...>

(2) save tran no


incrementa el nivel de
anidamiento.

(3) save tran no


incrementa el nivel de
anidamiento.

(5) rollback regresa al

(4) rollback regresa al


punto xyz. Entonces se
ejecutan las
subsiguientes
sentencias en proc2.

punto abc. Entonces se


ejecutan las
subsiguientes sentencias
en proc1.

if <error>
rollback tran xyz(4)
else ...

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

Lmite de anidamiento para procedimientos


Los procedimientos almacenados pueden llamar otros
procedimientos almacenados
El mximo nivel de anidamiento es 16
La variable @@nestlevel contiene el nivel de anidamiento
actual

Si se excede el nivel mximo:


Se abortan los procedimientos pendientes
El servidor retorna un error

Planes de bsqueda
Un plan de bsqueda es un conjunto ordenado de etapas que se
requieren para acceder los datos, incluyendo informacin sobre:
Si usar o no un ndice
El ndice a usar
El orden en el cual las tablas se deben encadenar

Los planes de bsqueda son creados por el optimizador de bsquedas


El optimizador de bsquedas usa informacin acerca de los objetos de base de
datos para producir el plan

Los planes de bsqueda 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 bsqueda no utilizado, el servidor lo usa
Si no hay un plan de bsqueda no utilizado, el servidor genera uno nuevo del
rbol de bsqueda en sysprocedures

Planes de bsqueda sub-ptimos


El plan de bsqueda creado para la una ejecucin de un procedimiento
almacenado puede que no sea el plan de bsqueda ptimo para la
siguiente ejecucin del procedimiento almacenado
Las dos ejecuciones pueden usar parmetros de entrada muy diferentes
Se pueden haber aadido nuevos ndices entre las dos ejecuciones
El tamao 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


bsqueda
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 opcin with recompile para
forzar al servidor a crear un nuevo plan de bsqueda 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

Ejecucin de procedimientos with recompile


Cuando se ejecute un procedimiento almacenado, usar
la opcin with recompile para forzar al servidor a crear
un nuevo plan de bsqueda para esa ejecucin del
procedimiento
Esta opcin 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 automticamente
cuando se modifica un dato de esa tabla

User-Defined

Can It Be

Can It Be

Can It Use

Explicitly

Executed

Parameters?

Called?

Automatically?

Yes

No

Yes

No

Yes

No

Stored
Procedure
Trigger

Aplicaciones Tpicas 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

Definicin de un trigger
Un trigger se define asociado con una tabla para una o
ms sentencias de manipulacin de datos
Un trigger se puede definir para insert, update, o delete o
cualquier combinacin de ellos

Activacin de un trigger
Cuando se modifica un dato en una tabla que tiene declarado
un trigger para esa sentencia, el trigger se dispara
El trigger se dispara una vez, independientemente del nmero de filas
afectadas
El trigger se dispara aunque no hayan filas afectadas

Triggers and transacciones


Un trigger es parte de la transaccin que causa el disparo
El trigger puede deshacer:
As mismo solamente
As mismo y la sentencia que causa el disparo
La transaccin total

Reglas para triggers


Los triggers pueden:
Declarar variables locales
Invocar procedimientos almacenados

Los triggers no pueden:

Llamarse directamente
Usar parmetros
Definirse sobre tablas temporales o vistas
Crear objetos permanentes de base de datos

Las operaciones con registro mnimo (como select into)


no disparan los triggers

Crear triggers
Sintaxis simplificada:

create trigger trigger_name


on table_name
for {insert | update | delete} [, {insert | update | delete} ...]
as
sql_statements

Ejemplo:
create trigger trg_i_sales
on sales
for insert
as
if datename (dd,getdate()) = "Sun"
begin
raiserror 40070, "Sales cannot be
processed on Sunday."
rollback trigger
end

Borrar Triggers
Sintaxis simplificada:
drop trigger trigger_name

Ejemplo:
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 informacin del trigger

sp_helptext trigger_name

Muestra el cdigo 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
myrows
)

datetime,
int

Crear un trigger que guarde la fecha y nmero de filas


afectadas por cada delete:
create trigger trg_d_myauthors
on myauthors
for delete
as
insert into myrecord
values (getdate(), @@rowcount)
return

Triggers - ejemplo
Ejecutar un delete y ver la tabla myrecords:
delete from myauthors
where state = "CA"
select * from myrecord

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 automticamente
cada vez que se dispara un trigger
inserted almacena cualquier fila que se vaya a aadir 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 funcin suser_name( ) para


listar la(s) fila(s) que se borraron y el nombre del usuario:
create trigger trg_d_myauthors
on myauthors
for delete
as
select suser_name(), "deleted these rows:"
select * from deleted
return

Ejecutar un delete que afecte ms 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 transaccin

Deshacer un trigger
Para deshacer un trigger, declarar un punto de grabacin y luego hacer el rollback
Un rollback sin punto de grabacin deshace toda la transaccin

Procedimiento almacenado
Caso A

begin tran
...
insert ...
print "in sp"
...
commit tran
print "sp done"

Trigger
save tran s1
....
rollback tran s1
print tr done
return

Procedimiento almacenado
Caso B

(este caso
ocaciona un
error)

begin tran
...
insert ...
print "in sp"
...
commit tran
print "sp done"

Trigger
begin tran s2
....
rollback tran s2
print tr done
return

Deshacer un trigger
rollback trigger deshace el trigger y la sentencia que lo
dispar
Sintaxis:

rollback trigger [with raiserror error_number [error_statement] ]

Ejemplo:
create trigger trg_i_publishers
on publishers
for insert
as
if @@rowcount > 1
begin
rollback trigger with raiserror 40031
"You cannot insert more than one
publisher at a time."
return
end

Deshacer un trigger
Procedimiento almacenado
Case C
begin tran
...
insert ...
print "in sp"
...
commit tran
print "sp done"

Trigger
....
....
rollback trigger
print tr done
return

Deshacer una transaccin


Para deshacer toda la transaccin donde est inmerso el trigger,
ejecutar un rollback sin un punto de grabacin
Procedimiento almacenado
Trigger
Case D
begin tran
...
insert ...
print "in sp"
...
commit tran
print "sp done"

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

begin tran
...
rollback tran
print "tr done
return

Trigger
....
....
Rollback tran
print tr done
return

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

Prcticas 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 condicin que le permite a un trigger
chequear si ha habido un cambio en una determinada
columna
Slo 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 modificacin hecha en un trigger

Nivel mximo de anidamiento: 16


Tanto los procedimientos almacenados como los triggers cuentan
en la determinacin del nivel mximo
@@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

Mtodos para integridad de datos


Dos mtodos 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

Actualizacin de valores llave


Accin deseada

Restricciones

Triggers

Insertarar valor de llave primaria

Permitido

Permitido

Insertar valor de llave fornea

Permitido

Permitido

Actualizar valor de llave primaria

No permitido*

Permitido

Actualizar valor de llave fornea

Permitido

Permitido

Borrar valor de llave primaria

No permitido*

Permitido

Borrar valor de llave fornea

Permitido

Permitido

*Valores de llaves primarias se pueden actualizar o borrar si no estn


referencidos en llaves forneas

Solamente en triggers es posible borrar o actualizar una


llave primaria
Slo en triggers es posible hacer cambios en cascada

Ejemplo
Ejemplo para mantener la integridad referencial de la llave fornea cuando se
inserta o actualiza la tabla salesdetail:
create trigger trg_iu_sales
on salesdetail
for insert, update as
declare @num_rows int
select @num_rows = @@rowcount
if @num_rows = 0
return
if (select count (*)
from titles t, inserted i
where t.title_id = i.title_id)
<> @num_rows
rollback transaction
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

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_salesdet
foreign key (stor_id, ord_num)
references sales (stor_id,
ord_num) )

Ejemplo
Ejemplo para mantener la integridad referencial de la llave fornea 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 ms rpidas que los triggers
Las restricciones no requieren codificacin 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
3

$SYBASE/install/errorlog

Sybase

1
$SYBASE/install/
RUN_SYBASE

$SYBASE/charsets (dir)
$SYBASE/locales (dir)

4
10

5
$SYBASE/sybase.cfg

userdb
13

/devices/datadev.dat

master model tempdb


11

$SYBASE/master.dat

sybsystemprocs
12

$SYBASE/sysprocs.dat

Configuracin del servidor ASE


Backup/recovery
Cache Manager
Disk I/O
Network
OS Resources
Memory
Processors
User environment
Lock Manager
Parallel query

SYBASE

Memory
Network

Backup/Recovery
Operating
Operating System
System

I/O

Locking

Creacin de bases de datos


model

master

sysobjects

sysindexes

sysdatabases sysusages

...

...

syscolumns
copies model
sysobjects
user database

sysindexes
...

syscolumns

Inserta
informacin
de las bases
de datos en
tablas del
sistema

Back-up y restauracin 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
Restauracin es el proceso de cargar los backups de datos y
de registro de transacciones

Back-up y restauracin de bases de datos


dump database Para backup de toda la base de datos
dump transaction Para hacer backup del registro de
transacciones
Ejemplo:
8 AM

9 AM

10 AM

Dump
Database

Dump
Tran 1

Dump
Tran 2

10:30 AM

Create/Load
Database

Load
Tran 1

Load
Tran 2

Despus 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)


pubs.asc (ASCII file)
0736, New Age, Boston
0877, Binnet, Washington
1389, Algodata, Berkeley

pubs2.dbo.publishers
pub_id
city
pub_id pub_name
pub_name
city
0736
Boston
0736 New
NewAge
Age
Boston
0877
Washington
0877 Binnet
Binnet
Washington
1389
Berkeley
1389 Algodata
Algodata
Berkeley

Bulk copy (bcp) es una utilidad para copiar rpidamente 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 ms o menos
rpido

La opcin 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

U1
U1
U2
U2

L5
L5

U3
U3

L6
L6
L7
L7
L8
L8
L9
L9

U4
U4

Logins

alias
alias dbo

db
db

Alias Usuarios Grupos

t1
t1

Permisios

L3
L3
L4
L4

PILOS
PILOS

GUEST
GUEST

LOCHOS
LOCHOS

L1
L1
L2
L2

A nivel de objetos/comandos

PUBLIC

A nivel de base de datos

view
view

t2
t2

sp 11
sp

t3
t3

sp 22
sp
sp 33
sp
sp 44
sp

t4
t4

Vistas y

Tablas

procedimientos

almacenados

Logins
Usuario
Servidor - Login
Todos los clientes deben dar un nombre de cuenta (login) y
palabra clave (password) vlidos 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 mtodo para validacin (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)

Despus 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 mltiples logins

Grupo
Nombre asignado a un conjunto de usuarios de una base de
datos
Mecanismo que busca simplificar la administracin

Usuarios en grupos
Todos los usuarios son miembros del grupo public
Un usuario puede pertenecer slo a otro grupo

Rol DBO
El DBO (database owner) es un usuario especial de la base
de datos
Tpicamente, tiene un login asociado
El dbo puede:

Aadir y borrar usuarios en la base de datos


Aadir 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 configuracin de la base de datos
Ejecutar chequeos para hacer diagnsticos

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 tambin lo tendrn
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 estn explcitamente 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 estn asociados con el
grupo public, aun si explcitamente estn definidos en
otro grupo
Un usuario puede asociarse a un grupo, adems del
grupo public
La precedencia del conjunto de permisos est determinado
de forma cronolgica

Jerarqua de permisos
Administradores
Administradores del
del Sistema
Sistema
Database
Database Owners
Owners
Propietarios
Propietarios de
de Database
Database Objects
Objects
Otros
Otros Usuarios
Usuarios

Permisos sobre objetos y comandos


Permisos sobre objetos:
Comando
Comando
select,
select,update
update
insert,
insert, delete
delete
references
references
execute
execute

Objeto
Objeto
Tabla,
Tabla,vista,
vista,columnas
columnas
Tabla,
Tabla,vista
vista
Tabla
Tabla
Procedimiento
Procedimientoalmacenado
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
Granted/Revoked

Defaults To
Statement

System
Database Object
Operator
Admin
Owner Owner

Public

Yes

No

alter table
create database
create default
create index
create rule

(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


restricted
N/A means use of the command is always
restricted

N/A

Permisos (tabla parcial)


Commands and Object Permissions
Can Be
Granted/Revoked

Defaults To
Statement

System
Database Object
Operator
Admin
Owner Owner

create table
create trigger
create view
delete
disk init
drop (any object)

(1) public can create temporary tables, no permission required


(2) If a view, permission defaults to view owner
(3) Defaults to store procedure owner

Public
(1)

Yes

No

(1)

(2)

No means use of the command is never


restricted
N/A means use of the command is always
restricted

N/A

Permisos (tabla parcial)


Commands and Object Permissions
Can Be
Granted/Revoked

Defaults To
Statement

System
Database Object
Operator
Admin
Owner Owner

dump database
dump transaction
execute (3)
grant on object
grant command
insert

(1) public can create temporary tables, no permission required


(2) If a view, permission defaults to view owner
(3) Defaults to store procedure owner

Public

Yes

No

(2)
No means use of the command is never
restricted
N/A means use of the command is always
restricted

N/A

Permisos (tabla parcial)


Commands and Object Permissions
Can Be
Granted/Revoked

Defaults To
Statement

System
Database Object
Operator
Admin
Owner Owner

load transaction
print
revoke on object
revoke command
select
set
update
(1) public can create temporary tables, no permission required
(2) If a view, permission defaults to view owner
(3) Defaults to store procedure owner

Public

Yes

No

(2)
(3)
No means use of the command is never
restricted
N/A means use of the command is always
restricted

N/A

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 configuracin para fijar las opciones de
auditoria

Se puede auditar el servidor, una base de datos, un usuario y


cualquier objeto de base de datos

You might also like