81
Unidad 3

Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

Embed Size (px)

Citation preview

Page 1: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

Unidad 3

Page 2: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD?

• …

• Organización de programa en bloques.

Page 3: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• CREATE…

• AS• DECLARE…• …• Sentencias SQL• …

Page 4: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Manejo de excepciones: control de errores.• PL/SQL usa bloque de exceptions.

DECLARE....excep EXCEPTION; /* (2) */BEGIN...IF ... THENRAISE excep; /* (2) */END IF;...EXCEPTIONWHEN TOO_MANY_ROWS THEN /* (1) */sentencias_manejo_excepcion_sistema;WHEN excep THEN /* (2) */sentencias_manejo_excepcion_usuario;WHEN OTHERS THEN ...;;END;

Page 5: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• SQL Server 2005 posee un mecanismo de manejo de excepciones en un formato de bloque TRY/CATCH:

BEGIN TRY

INSERT INTO Sales.Currency (CurrencyCode, Name, ModifiedDate )

VALUES('LAE','Pol','01/06/2005')

PRINT 'Inserción completada con exito.'

END TRY

BEGIN CATCH

PRINT 'Inserción fallida.'

END CATCH

Page 6: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

BEGIN TRYDECLARE @divisor int ,  @dividendo int,   @resultado int

SET @dividendo = 100SET @divisor = 0

   -- Esta linea provoca un error de division por 0SET @resultado = @dividendo/@divisorPRINT 'No hay error‘END TRY

BEGIN CATCHPRINT 'Se ha producido un error‘END CATCH

Page 7: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• SQL Server 2000 no maneja el TRY/CATCH.

• Qué se ha usado para controlar errores?

• IF ELSE…PRINT…RETURN

Page 8: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• @@ERROR. Variable global de sistema. Almacena el número de error producido por la última sentencia Transact SQL ejecutada.

• Devuelve 0 si la última instrucción Transact-SQL se ejecutó con éxito.

• Si la instrucción causó un error, devuelve el número de error. • El valor de @@ERROR cambia al finalizar cada instrucción

Transact-SQL.

• Qué se aconseja?• Guardar @@ERROR en una variable de tipo entero

inmediatamente después de que se complete la instrucción Transact-SQL. El valor de la variable se puede usar posteriormente.

Page 9: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

DECLARE @divisor int , @dividendo int , @resultado int

SET @dividendo = 100

SET @divisor = 0

/*se genera una division por 0->error*/

SET @resultado = @dividendo/@divisor

IF @@ERROR = 0

PRINT 'No hay error'

ELSE

PRINT 'Error de division'

Page 10: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

DECLARE @divisor int , @dividendo int , @resultado int

SET @dividendo = 100

SET @divisor = 0

/*se genera una division por 0->error*/

SET @resultado = @dividendo/@divisor

/*esta linea vuelve a establecer @@error a 0*/

PRINT 'Controlando el error ...'

IF @@ERROR = 0

PRINT 'No hay error'

ELSE

PRINT 'Error de division'

Page 11: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

DECLARE @divisor int,@dividendo int , @resultado int

declare @nu int

SET @dividendo = 100

SET @divisor = 0

SET @resultado = @dividendo/@divisor

set @nu=@@error

print 'Controlando el error...'

IF @nu = 0

PRINT 'No hay error'

ELSE

PRINT 'Hay error: ' +cast(@nu as varchar)

Page 12: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• En ocasiones es necesario provocar voluntariamente un error;  nos puede interesar que se genere un error cuando los datos incumplen una regla de negocio.

• Se puede provocar un error en tiempo de ejecución a través de la función RAISERROR.

Page 13: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Raiserror. Devuelve un mensaje de error definido por el usuario y establece un indicador del sistema para registrar que se ha producido un error; más eficaz que PRINT para devolver mensajes a las aplicaciones.

• Sintaxis• RAISERROR ( { msg_id | msg_str } { , severity ,

state }     [ , argument [ ,...n ] ] )     [ WITH option [ ,...n ] ]

Page 14: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• msg_id. Número de mensaje de error definido por el usuario que está almacenado en la tabla sysmessages. Deben ser mayores de 50.000.

• msg_str. Mensaje ad hoc con un formato similar al estilo de formato PRINT... Puede contener un máximo de 400 caracteres. Si el mensaje contiene más de 400 caracteres, solamente aparecerán los 397 primeros y se agregarán puntos suspensivos…

• Severity. Nivel de gravedad definido por el usuario que se asocia con este mensaje. Todos los usuarios pueden utilizar los niveles de gravedad de 0 a 18.

• State. Entero arbitrario entre 1 y 127 que representa información acerca del estado de llamada del error. Un valor negativo de state pasa a tener un valor predeterminado de 1.

• VER RESTO DE CONFIGURACION

Page 15: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

Create procedure chequearpersona1 (@dni varchar(9))asif exists (select * from persona where dni=@dni)beginselect nombre, apellido from persona where dni=@dniendelseraiserror ('Valor pedido no existe', 16, 1)

exec chequearpersona1 '343434343'

Page 16: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Es posible definir errores de usuario con el fin de poder reutilizarlos, y así ofrecer un comportamiento homogéneo.

• Esto puede realizarse a través del procedimiento almacenado del sistema sp_addmessage (especificando código de error, severidad, texto del error, e idioma).

• Pueden consultarse los errores existentes en sysmessages.

Page 17: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• EXEC sp_addmessage @msgnum = 50001, @severity = 16, @msgtext = 'No existe elemento buscado', @lang = 'us_english‘

• SELECT * FROM master.dbo.sysmessages

Create procedure chequearpersona1 (@dni varchar(9))asif exists (select * from persona where dni=@dni)beginselect nombre, apellido from persona where dni=@dniendelseraiserror (50001, 16, 1)

Page 18: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Apliquemos @@error y raiserror a algun procedimiento realizado anteriormente.

• Que tipo de problema podria ser?

• Select?

• Qué error podría surgir con un select?

• Uso de @@rowcount

Page 19: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

Create procedure chequearpersona (@dni varchar(9))

asif exists (select * from persona where dni=@dni)beginselect nombre, apellido from persona where

dni=@dniendelseprint 'Persona no esta registrada'

Page 20: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Insertar un registro de persona.

• Puede surgir un error ?

Page 21: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

Create procedure insertarpersona5 (@DNI varchar(9), @nombre varchar(25), @apellido varchar(50), @ciudad varchar(25), @direccioncalle varchar(50), @direccionnum varchar(3), @telefono varchar(9), @fechanacimiento datetime, @varon char(1))

asinsert into persona (DNI, Nombre, Apellido, Ciudad,

DireccionCalle, DireccionNum, Telefono, FechaNacimiento, Varon)

values (@DNI, @Nombre, @APellido, @Ciudad, @DireccionCalle, @DireccionNum, @Telefono, @FechaNacimiento, @Varon)

Page 22: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Hacer lo mismo con el siguiente PA (actualiza id de una titulacion)

create PROCEDURE updatetitulacion1 (@idtitantiguo numeric(6), @idtitnuevo numeric(6)) AS if (select count(*) from titulacion where idtitulacion=@idtitantiguo)=1 begin if (select count(*) from titulacion where idtitulacion=@idtitnuevo)=0 begin update titulacion set idtitulacion=@idtitnuevo where idtitulacion=@idtitantiguo return 0 end else return 2 end else return 1

Page 23: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Uso de INTO en SELECT• Into en select…

Page 24: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• INTO (en SELECT). La cláusula INTO habilita para especificar que el conjunto de resultados se utilizará para crear una tabla nueva con el nombre definido en la cláusula: Crea una nueva tabla e inserta en ella las filas resultantes…

• Se suele utilizar para crear tablas de trabajo, o tablas intermedias; se crean para una determinada tarea y luego se borran.

• Se puede utilizar para crear una copia de seguridad de la tabla.

• Sintaxis. • INTO new_table

Page 25: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

SELECT * INTO new_table_name FROM old_tablename

SELECT column_name(s) INTO new_table_name FROM old_tablename

En BD Universidad:select * into copia from persona

Page 26: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

select Nombre, Apellidointo copia1 from persona

select Nombre, Apellidointo copia1 from personaWhere ciudad=‘Concepcion’

select Asignatura.Nombre as asig, persona.nombre, persona.apellidointo copia2from asignatura, profesor, personaWhere asignatura.idprofesor=profesor.idprofesorand profesor.dni=persona.dni

Page 27: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• No confundir con…• INSERT INTO…SELECT:

• Inserción multiple de filas.• La sentencia INSERT permite tambien insertar

varios registros en una tabla. • Pare ello se utiliza una combinación de la

sentencia INSERT junto a una sentencia SELECT.

• El resultado es que se insertan todos los registros devueltos por la consulta.

Page 28: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Sintaxis.• INSERT INTO <nombre_tabla>

[(<campo1>[,<campo2>,...])]SELECT [(<campo1>[,<campo2>,...])]FROM<nombre_tabla_origen>;

• Se deben cumplir las siguientes normas:• La lista de campos de las sentencias insert y select

deben coincidir en número y tipo de datos.• Ninguna de las filas devueltas por la consulta debe

infringir las reglas de integridad de la tabla en la que vayamos a realizar la inserción.

Page 29: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

create table ciudades

(id int identity (1,1) primary key,

ciudad varchar (30))

insert into ciudades (ciudad)

select distinct ciudad

from persona

Page 30: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Hacer un PA para la tabla persona, con parametro de entrada (ciudad) que realice un select de todas las personas de esas ciudad, y genere una copia de seguridad con esos datos.

Page 31: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Modificar PA usando @@error o @rowcount, raiserror

Page 32: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Cursor. Variable que permite recorrer un conjunto de resultados obtenidos a través de una SELECT fila a fila: permiten situarse en filas específicas del conjunto de resultados.

• Recuperan una fila o bloque de filas. • Aceptan modificaciones de los datos de las filas

en la posición actual del conjunto de resultados

• En qué se podrían relacionar los SELECT INTO e INSERT INTO SELECT con cursores?

Page 33: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Para trabajar con cursores se deben seguir los siguientes pasos:

• Declarar el cursor, utilizando DECLARE• Abrir el cursor, utilizando OPEN• Leer los datos del cursor, utilizando FETCH ...

INTO• Cerrar el cursor, utilizando CLOSE• Liberar el cursor, utilizando DEALLOCATE

Page 34: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Sintaxis General

• -- Declaración del cursor• DECLARE <nombre_cursor> CURSOR • FOR• <sentencia_sql>

• -- apertura del cursor• OPEN <nombre_cursor>

• -- Lectura de la primera fila del cursor• FETCH <nombre_cursor> INTO <lista_variables>

• WHILE (@@FETCH_STATUS = 0)• BEGIN • -- Lectura de la siguiente fila de un cursor• FETCH <nombre_cursor> INTO <lista_variables>• ... • END -- Fin del bucle WHILE

• -- Cierra el cursor• CLOSE <nombre_cursor>• -- Libera los recursos del cursor• DEALLOCATE <nombre_cursor>

Page 35: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• @@FETCH_STATUS. Variable global. Devuelve el estado de la última instrucción FETCH de cursor ejecutada.

Page 36: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Ejemplo. Abrir un cursor y recorrerlo:

DECLARE persona_Cursor CURSOR FOR SELECT Nombre, Apellido, CiudadFROM persona WHERE varon=1

OPEN persona_Cursor

FETCH NEXT FROM persona_Cursor

WHILE @@FETCH_STATUS = 0 BEGIN

FETCH NEXT FROM persona_Cursor

END CLOSE persona_Cursor DEALLOCATE persona_Cursor

Page 37: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Ejemplo. Abrir un cursor, recorrerlo e imprimir:

DECLARE @nombre varchar(20) DECLARE @apellido varchar(20) DECLARE @ciudad varchar(20)

DECLARE persona_Cursor CURSOR FOR SELECT Nombre, Apellido, CiudadFROM persona WHERE varon=1ORDER BY Apellido, Nombre

OPEN persona_Cursor FETCH NEXT FROM persona_Cursor INTO @nombre, @apellido, @ciudad WHILE @@FETCH_STATUS = 0 BEGIN

PRINT +@nombre +' '+@apellido +' vive en '+@ciudad

FETCH NEXT FROM persona_Cursor INTO @nombre, @apellido, @ciudad

END CLOSE persona_CursorDEALLOCATE persona_Cursor

Page 38: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Ejemplo. Abrir un cursor, recorrerlo y actualizar:

DECLARE @nombre varchar(20)

DECLARE @creditos float

DECLARE @coste float

DECLARE asig_Cursor CURSOR FOR

SELECT Nombre, creditos, costebasico

FROM asignatura

OPEN asig_Cursor

FETCH NEXT FROM asig_Cursor into @nombre, @creditos, @coste

WHILE @@FETCH_STATUS = 0

BEGIN

update asignatura

set costebasico=@coste+@creditos*4

where nombre=@nombre

FETCH NEXT FROM asig_Cursor into @nombre, @creditos, @coste

END

CLOSE asig_Cursor

DEALLOCATE asig_Cursor

Page 39: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Ejecutar el siguiente cursor

• Que hace?

Page 40: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

SET NOCOUNT ONDECLARE @nom varchar(20), @cont varchar(30), @message varchar (80),@nombp varchar (20)PRINT '-------- proveedores almacen kollao--------'DECLARE proov_cursor CURSOR FOR SELECT nombre, nombre_contactoFROM proveedorOPEN proov_cursor FETCH NEXT FROM proov_cursorINTO @nom, @cont WHILE @@FETCH_STATUS = 0 BEGIN PRINT ' 'SELECT @message = '----- productos por proveedor: ' + @nom + ' ,' + @cont PRINT @message DECLARE prod_cursor CURSOR FOR SELECT nombre_fantasiaFROM proveedor, productoWHERE producto.proveedor=proveedor.codigo_proveedor and proveedor.nombre=@nomOPEN prod_cursor FETCH NEXT FROM prod_cursor INTO @nombp IF @@FETCH_STATUS <> 0 PRINT ' <<No productos>>'WHILE @@FETCH_STATUS = 0 BEGIN SELECT @message = ' ' + @nombpPRINT @message FETCH NEXT FROM prod_cursor INTO @nombp END CLOSE prod_cursor DEALLOCATE prod_cursor FETCH NEXT FROM proov_cursor INTO @nom, @cont END CLOSE proov_cursor DEALLOCATE proov_cursor

Page 41: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• /* Este cursor deja las contraseñas iguales al nombre de usuario. La tabla Cliente tiene estos tres campos: CliCod, CliUser, CliPass */

-- declaramos las variables declare @cod as int declare @user as varchar(50) declare @pass as varchar(50)

• -- declaramos un cursor llamado "CURSORITO". declare CURSORITO cursor for select CliCod, CliUser, CliPass from Cliente

• open CURSORITO -- Avanzamos un registro y cargamos en las variables los valores encontrados en el primer registro

• fetch next from CURSORITO into @cod, @user, @pass     while @@fetch_status = 0         begin         update Cliente set CliPass= @user where CliCod=@cod         -- Avanzamos otro registro         fetch next from CURSORITO         into @cod, @user, @pass         end -- cerramos el cursor close CURSORITO deallocate CURSORITO

Page 42: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Generar un PA que a traves de un cursor, imprima el nombre, creditos y cuatrimestre de las asignaturas registradas.

Page 43: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Generar un PA que a traves de un cursor, imprima el nombre, creditos y cuatrimestre de ciertas asignaturas registradas, de acuerdo a parametro de entrada (cuatrimestre).

Page 44: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Cursores con parametros.

• Al declarar un cursor podemos definir:

• DECLARE <nombre_cursor> CURSOR [ LOCAL | GLOBAL ] • [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC

| FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR <sentencia_sql>

INVESTIGAR• [ LOCAL | GLOBAL ]• [ FORWARD_ONLY | SCROLL ]• [ STATIC | DYNAMIC | FAST_FORWARD ]• [ READ_ONLY]

Page 45: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Triggers-Disparadores

Page 46: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Clase especial de procedimiento almacenado que se ejecuta automáticamente (se “dispara”) cuando se produce un evento en el servidor de bases de datos.

• Se ejecuta siempre que se intenta modificar los datos de una tabla que el trigger protege: realizar un INSERT, UPDATE o DELETE…dependiendo de la accion especificada.

• No es posible evitar su ejecución.• Los triggers se definen para una tabla específica,

denominada tabla del trigger.

Page 47: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• No es posible invocar directamente los triggers, que tampoco pasan ni aceptan parámetros.

• Gran herramienta para controlar reglas de negocio más complejas que una simple integridad referencial.

• Ojo: el usuario no espera que el trigger le devuelva registros luego de agregar o modificar información.

Page 48: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Sintaxis.

CREATE trigger <Nombre del trigger>ON <Nombre de la Tabla>FOR <INSERT l UPDATE l DELETE>ASSentencias….

Page 49: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Un trigger para inserción de registros genera automáticamente una tabla en el cache con la información que intenta añadir, esta tabla se denomina INSERTED y es a través de esta tabla que se pueden hacer comparaciones en otras tablas.

• Un trigger para eliminación de registros genera automáticamente una tabla en el cache con la información que intenta eliminar, esta tabla se denomina DELETED y es a través de esta tabla que se pueden hacer comparaciones en otras tablas.

• Si se trata de un trigger para actualización se generan ambas tablas INSERTED con los nuevos datos y DELETED con la información que será reemplazada.

Page 50: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Un trigger se "dispara" sólo cuando la instrucción de modificación de datos finaliza.

• SQL Server verifica la posible violación de tipos de datos, reglas o restricciones de integridad.

• El trigger y la instrucción que lo "dispara" se consideran una sola transacción que puede revertirse desde dentro del disparador.

• Si se detecta un error grave, se revierte toda la transacción.

Page 51: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

create TRIGGER reminder ON persona

FOR INSERT, UPDATE AS

PRINT 'Se está intentando modificar datos‘

/*RAISERROR...*/

Page 52: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• INSERT

• Aplicar reglas de negocio…???

Page 53: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Las personas que se registren en almacenes Kollao como clientes deben ser mayores de 18 años.

• Como seria un trigger que verifique esto?

Page 54: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

create trigger insertclienteedad on clientefor insert as

declare @fecha datetimeselect @fecha= fecha_nacimiento from insertedif (datediff(yy,@fecha, getdate()))<18beginraiserror (‘No se aceptan clientes menores de 18

años',16,1)endelseprint ‘Se inserto cliente exitosamente'

Page 55: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

create trigger insertclienteedad on clientefor insert as

declare @fecha datetimeselect @fecha= fecha_nacimiento from insertedif (datediff(yy,@fecha, getdate()))<18beginraiserror (‘No se aceptan clientes menores de 18 años',16,1)rollback transaction /*deshace la transaccion*/endelseprint ' Se inserto cliente exitosamente '

Page 56: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Se necesita insertar un producto cuya fecha de vencimiento sea minimo en 15 dias despues del registro.

Page 57: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• No se aceptan productos con un stock menor a 10.

Page 58: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• No mas de 5 productos de un proveedor.

Page 59: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Insercion en compra.• …• Cantidad comprada con tarjeta de credito no

pueden ser de mayor de 10.

Page 60: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

create trigger insertcompratc on comprafor insert as

if (select forma_pago from inserted)='t' and (select cantidad from inserted)>10

beginraiserror ('No se aceptan compras con tarjeta de

credito de cantidad mayor de 10 ',16,1)rollback transaction endelseprint 'Compra valida'

Page 61: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• No se puede comprar una cantidad de producto mayor al stock.

Page 62: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Sin embargo, ese trigger no actualiza el stock, si es que éste es suficiente…

Page 63: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Veamos que pasa con Update.

Page 64: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Al modificar algun dato de sucursal, se debe manejar un respaldo de sus datos, incluida fecha y usuario que genero la modificacion.

Page 65: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

create table auditsuc

(nr int identity (1,1) primary key,

cod varchar(6),

dir varchar (50),

tel varchar (12),

fecha datetime,

usuario varchar(10))

Page 66: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

create trigger modsucursal on sucursalfor update as

declare @cod varchar(6), @dir varchar (50), @tel varchar(12)

select @cod=(select codigo_sucursal from deleted) select @dir=(select direccion from deleted) select @tel=(select telefono_sucursal from deleted) insert into auditsuc (cod, dir, tel,fecha,usuario)values(@cod, @dir, @tel, getdate(), user)

Page 67: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• @@rowcount. Variable global. Guarda el numero de filas afectadas por la ultima instrucción.

Page 68: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

alter trigger modsucursal on sucursalfor update as

if @@rowcount=1begindeclare @cod varchar(6), @dir varchar (50), @tel varchar(12)select @cod=(select codigo_sucursal from deleted) select @dir=(select direccion from deleted) select @tel=(select telefono_sucursal from deleted)

insert into auditsuc (cod, dir, tel,fecha,usuario)values(@cod, @dir, @tel, getdate(), user)endelseraiserror(‘No se pueden realizar actualizaciones de varias filas',16,1)rollback transaction

Page 69: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• On UPDATE en una fila especifica…

Page 70: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

create table auditsuc1(nr int identity (1,1) primary key,cod varchar(6),tel varchar (12),fecha datetime,usuario varchar(10))

create trigger modsucursaltel on sucursalfor update asif update(telefono_sucursal)begindeclare @cod varchar(6), @tel varchar(12)select @cod=(select codigo_sucursal from deleted) select @tel=(select telefono_sucursal from deleted) insert into auditsuc1 (cod, tel,fecha,usuario)values(@cod, @tel, getdate(), user)end

Page 71: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• No esta permitido realizar modificaciones los fines de semana

Page 72: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• DELETE.

• Al eliminarse un proveedor, se debe manejar un respaldo de los datos eliminados.

Page 73: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

create table auditproveedor(nr int identity (1,1) primary key,cod varchar(6),nom varchar (20),contacto varchar (30),tel varchar (12),fecha datetime,usuario varchar(10))

Page 74: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

create trigger delproveedor on proveedorfor delete as

declare @cod varchar(6), @nom varchar (20), @contacto varchar (30),@tel varchar(12)

select @cod=(select codigo_proveedor from deleted) select @nom=(select nombre from deleted) select @contacto=(select nombre_contacto from deleted) select @tel=(select telefono_contacto from deleted)

insert into auditproveedor (cod, nom, contacto, tel ,fecha,usuario)

values(@cod, @nom, @contacto, @tel, getdate(), user)

Page 75: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

create trigger delproveedor on proveedorfor delete as

declare @cod varchar(6), @nom varchar (20), @contacto varchar (30),@tel varchar(12)

If @@rowcount=1beginselect @cod=(select codigo_proveedor from deleted) select @nom=(select nombre from deleted) select @contacto=(select nombre_contacto from deleted) select @tel=(select telefono_contacto from deleted) insert into auditproveedor (cod, nom, contacto, tel ,fecha,usuario)values(@cod, @nom, @contacto, @tel, getdate(), user)endElse Raiserror (‘No se puede eliminar mas de un proveedor a la vez’,16,1)

Page 76: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• No se puede borrar mas de un proveedor a la vez!!!

Page 77: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

create trigger delproveedor1 on proveedorfor delete as

IF (SELECT COUNT(*) FROM Deleted) > 1 BEGIN RAISERROR(‘No puede borrar más de un

proveedor al mismo tiempo.’,16, 1) ROLLBACK TRANSACTION END

Page 78: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

create trigger delproveedor1 on proveedorfor delete as

IF @@rowcount > 1 BEGIN RAISERROR(‘No puede borrar más de un

proveedor al mismo tiempo.’,16, 1) ROLLBACK TRANSACTION END

Page 79: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• Conocer triggers creados:• select *

from sysobjects where type = ‘TR’

• Obtener el texto del trigger• sp_helptext nombretrigger

Page 80: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• ALTER TRIGGER• DROP Trigger

• Deshabilitar• ALTER TABLE compra• DISABLE TRIGGER insertcomprastock

• Habilitar• ALTER TABLE compra• ENABLE TRIGGER insertcomprastock

Page 81: Unidad 3. De acuerdo a lo visto, cómo es la organización o estructura de un programa en el servidor de BD? … Organización de programa en bloques

• **************