Академический Документы
Профессиональный Документы
Культура Документы
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
select @number = 10
• 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"
select @@error
------
156
Ejemplo
• Crear una tabla:
select * into mytitles
from pubs2..titles
• 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.
• 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."
• 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
• Ejecutar el procedimiento:
exec proc_hello
----------
23.00
• 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"
** 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
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
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
• 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
• 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
• 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
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
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
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
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
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
Database Owners
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
(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