03 Separata T SQL 2021 1e
03 Separata T SQL 2021 1e
03 Separata T SQL 2021 1e
TRANSACT-SQL
CEPSUNI – 2021
LIMA - PERU
PROGRAMACIÓN CON
TRANSACT-SQL
Primera Edición
LIMA - PERÚ
PRESENTACIÓN
T-SQL es un lenguaje muy potente que te permite definir casi cualquier tarea que
quieras ejecutar sobre la base de datos; incluye características propias de cualquier
lenguaje de programación, características que te permiten definir la lógica necesaria
para el tratamiento de datos.
Al estudiar este curso te estás preparando como programador para que puedas
desempeñarte como programador de base de datos SQL Server.
Índice
CONCEPTO ................................................................................................................................................... 13
ACCESO A LOS DATOS ................................................................................................................................... 14
CRITERIOS PARA CREAR ÍNDICES ................................................................................................................... 15
Razones para crear índices ....................................................................................................................... 15
Razones para no crear índices .................................................................................................................. 15
Columnas a indexar ................................................................................................................................. 16
Columnas que no deben indexarse ........................................................................................................... 16
TIPOS DE ÍNDICES ......................................................................................................................................... 17
Indice clustered ........................................................................................................................................ 17
Indice nonclustered .................................................................................................................................. 17
CREACIÓN DE INDICES .................................................................................................................................. 18
Creación de índice CLUSTERED ................................................................................................................. 18
Creación de índice NONCLUSTERED.......................................................................................................... 18
Creación de índice UNIQUE ...................................................................................................................... 18
MANTENIMIENTO DE INDICES ...................................................................................................................... 19
Borrar un índice ....................................................................................................................................... 19
Regenerar un índice ................................................................................................................................. 19
Regenerar los índices de una tabla ........................................................................................................... 19
Fragmentación de índices ........................................................................................................................ 20
Reorganizar índices .................................................................................................................................. 20
Reorganizar todos los índices de una tabla .............................................................................................. 20
INTRODUCCIÓN ............................................................................................................................................ 21
T-SQL permite .......................................................................................................................................... 21
T-SQL no permite ..................................................................................................................................... 21
REGLAS DE FORMATO DE LOS IDENTIFICADORES .......................................................................................... 22
BLOQUE........................................................................................................................................................ 34
ESTRUCTURAS CONDICIONALES ................................................................................................................... 34
Estructura: IF ........................................................................................................................................... 34
Estructura: CASE ...................................................................................................................................... 35
ESTRUCTURAS DE BUCLE .............................................................................................................................. 37
Estructura WHILE ..................................................................................................................................... 37
Sentencia BREAK ...................................................................................................................................... 37
Sentencia CONTINUE ............................................................................................................................... 37
Sentencia GOTO ....................................................................................................................................... 37
INSERTANDO DATOS..................................................................................................................................... 39
Sentencia INSERT ..................................................................................................................................... 39
Insertar una sola fila de datos .................................................................................................................. 39
Insertar varias filas de datos .................................................................................................................... 40
Insertar datos en una tabla con una columna identidad ........................................................................... 40
Usar TOP para limitar los datos insertados de la tabla origen .................................................................. 41
Ejercicio 1 ................................................................................................................................................ 42
Ejercicio 2 ................................................................................................................................................ 42
ACTUALIZANDO DATOS ................................................................................................................................ 43
Sentencia UPDATE ................................................................................................................................... 43
Usar una instrucción UPDATE simple........................................................................................................ 43
Actualizar varias columnas ...................................................................................................................... 43
Usar la cláusula WHERE ........................................................................................................................... 44
CONTROL DE ERRORES.................................................................................................................................. 64
Variable: @@ROWCOUNT ....................................................................................................................... 64
Función: ROWCOUNT_BIG ( ) ................................................................................................................... 64
Variable: @@ERROR................................................................................................................................ 64
Función: RAISERROR ( ) ............................................................................................................................ 65
MANEJO DE EXCEPCIONES ............................................................................................................................ 66
Estructura TRY/CATCH ............................................................................................................................. 66
Sentencia: THROW ................................................................................................................................... 70
REQUERIMIENTOS A RESOLVER .................................................................................................................... 71
Requerimiento 1 ...................................................................................................................................... 71
Requerimiento 2 ...................................................................................................................................... 71
Requerimiento 3 ...................................................................................................................................... 72
INTRODUCCIÓN ............................................................................................................................................ 93
TIPOS DE TRIGGERS DDL ............................................................................................................................... 94
Trigger Transact-SQL DDL ........................................................................................................................ 94
Desencadenante CLR DLL ......................................................................................................................... 94
Ámbito de los triggers DDL....................................................................................................................... 95
MANTENIMIENTO DE TRIGGERS DDL ............................................................................................................ 98
Creación de trigger DDL ........................................................................................................................... 98
Modificar triggers DDL ............................................................................................................................. 98
Deshabilitar y eliminar triggers DDL ......................................................................................................... 99
EJEMPLOS................................................................................................................................................... 100
Ejemplo 32: Log de cambios en el sistema .............................................................................................. 100
Ejemplo 33: Log de cambios de inicios de sesión u usuarios.................................................................... 102
BASES DE DATOS
OBTENER SCRIPTS
Para obtener los scripts de las bases de datos utilizadas en la presente separata utiliza
la siguiente URL:
https://github.com/gcoronelc/databases
vch_emplpaterno: varchar(25) NOT NULL chr_sucucodigo: char(3) NOT NULL (FK) vch_sucunombre: varchar(50) NOT NULL
vch_emplmaterno: varchar(25) NOT NULL chr_emplcodigo: char(4) NOT NULL (FK) vch_sucuciudad: varchar(30) NOT NULL
vch_emplnombre: varchar(30) NOT NULL dtt_asigfechaalta: datetime NOT NULL vch_sucudireccion: varchar(50) NOT NULL
vch_emplciudad: varchar(30) NOT NULL dtt_asigfechabaja: datetime NULL int_sucucontcuenta: integer NOT NULL
vch_empldireccion: varchar(50) NOT NULL
vch_emplusuario: varchar(15) NOT NULL Cuenta
vch_emplclave: varchar(15) NOT NULL Cliente
chr_cuencodigo: char(8) NOT NULL
chr_cliecodigo: char(5) NOT NULL
chr_monecodigo: char(2) NOT NULL (FK)
chr_sucucodigo: char(3) NOT NULL (FK) vch_cliepaterno: varchar(25) NOT NULL
chr_emplcreacuenta: char(4) NOT NULL (FK) vch_cliematerno: varchar(25) NOT NULL
Movimiento
chr_cliecodigo: char(5) NOT NULL (FK) vch_clienombre: varchar(30) NOT NULL
chr_cuencodigo: char(8) NOT NULL (FK) dec_cuensaldo: money NOT NULL chr_cliedni: char(8) NOT NULL
int_movinumero: integer NOT NULL dtt_cuenfechacreacion: datetime NOT NULL vch_clieciudad: varchar(30) NOT NULL
vch_cuenestado: varchar(15) NOT NULL vch_cliedireccion: varchar(50) NOT NULL
chr_emplcodigo: char(4) NOT NULL (FK)
int_cuencontmov: integer NOT NULL vch_clietelefono: varchar(20) NULL
chr_tipocodigo: char(3) NOT NULL (FK)
chr_cuenclave: char(6) NOT NULL vch_clieemail: varchar(50) NULL
dtt_movifecha: datetime NOT NULL
dec_moviimporte: money NOT NULL
chr_cuenreferencia: char(8) NULL TipoMovimiento
chr_tipocodigo: char(3) NOT NULL
Contador Moneda
vch_tipodescripcion: varchar(40) NOT NULL
vch_conttabla: varchar(30) NOT NULL vch_tipoaccion: varchar(10) NOT NULL chr_monecodigo: char(2) NOT NULL
vch_tipoestado: varchar(15) NOT NULL vch_monedescripcion: varchar(20) NOT NULL
int_contitem: integer NOT NULL
int_contlongitud: integer NOT NULL CostoMovimiento
chr_monecodigo: char(2) NOT NULL (FK)
Parametro dec_costimporte: money NOT NULL
CargoMantenimiento
chr_paracodigo: char(3) NOT NULL
InteresMensual
chr_monecodigo: char(2) NOT NULL (FK)
vch_paradescripcion: varchar(50) NOT NULL chr_monecodigo: char(2) NOT NULL (FK)
vch_paravalor: varchar(70) NOT NULL dec_cargMontoMaximo: money NOT NULL
vch_paraestado: varchar(15) NOT NULL dec_inteimporte: money NOT NULL dec_cargImporte: money NOT NULL
Capítulo 1
GESTIÓN DE INDICES
CONCEPTO
Un índice es una estructura que proporciona acceso rápido a las filas de una tabla en
base a los valores de una o más columnas (clave).
▪ Usando los índices. Este proceso se conoce como Index Seek. Cuando SQL
Server usa un índice, esto es lo que sucede:
✓ Atraviesa la estructura de árbol del índice para encontrar las filas que la
consulta requiere.
Cuando se envía una consulta, SQL Server determina primero si un índice existe.
Entonces, el Query Optimizer, el componente responsable de generar el plan de
ejecución óptimo para la consulta, determina si es más eficaz examinar la tabla o
utilizar el índice para acceder a los datos.
▪ Clave foránea.
TIPOS DE ÍNDICES
Indice clustered
▪ Ordena físicamente la tabla. Las filas de la tabla se ordenan según el orden
de los valores claves del índice clustered.
Indice nonclustered
▪ Es el tipo de índice por defecto.
Observación:
▪ Se pueden definir hasta 249 índices por tabla.
CREACIÓN DE INDICES
Sintaxis
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql
Ejemplo 1
Ejemplo 2
Ejemplo 3
MANTENIMIENTO DE INDICES
Borrar un índice
Sintaxis
Regenerar un índice
SELECT
c.name "Table name",
b.name "Index",
avg_fragmentation_in_percent "Frag (%)",
page_count "Page count"
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL ) AS a
JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id
JOIN sys.tables c ON b.object_id = c.object_id
ORDER BY 3 DESC;
GO
Reorganizar índices
Sintaxis
Sintaxis
Capítulo 2
FUNDAMENTOS GENERALES
INTRODUCCIÓN
T-SQL permite
Con T-SQL puedes:
▪ Etc.
T-SQL no permite
Hay algunas cosas que no podrás hacer:
Los identificadores son los nombres de los objetos: servidores, bases de datos, tablas,
vistas, columnas, índices, funciones, procedimientos, triggers, restricciones, reglas,
etc.
▪ El nombre debe tener entre 1 y 128 caracteres, excepto para algunos tipos de
objetos en los que el número es más limitado.
Si quieres utilizar un nombre que no siga estas reglas, normalmente para poder incluir
espacios en blanco, lo tienes que escribir encerrado entre corchetes (también se
pueden utilizar las comillas, pero se recomienda utilizar los corchetes).
LAS EXPRESIONES
Los operadores se pueden usar para combinar dos o más expresiones simples y
formar una expresión compleja. Dos expresiones pueden combinarse mediante un
operador si ambas tienen tipos de datos admitidos por el operador y se cumple al
menos una de estas condiciones:
Tipos de operadores
1. Operadores numéricos
3. Operadores de comparación.
4. Operadores lógicos.
5. Operadores de cadenas.
Resultados de la expresión
Si se combinan dos expresiones mediante operadores de comparación o lógicos, el
tipo de datos resultante es booleano y el valor es uno de los siguientes: TRUE, FALSE
o UNKNOWN.
Comentarios
Como en cualquier otro lenguaje de programación, se utilizan comentarios destinados
a facilitar la legibilidad del código.
Sintaxis
-- Este es un comentario
BEGIN...END
Encierra un conjunto de instrucciones Transact-SQL de forma que estas instrucciones
formen un bloque de instrucciones.
Sintaxis
BEGIN
-- Instrucciones
END
Capítulo 3
FUNDAMENTOS DE PROGRAMACIÓN
BLOQUE ANÓNIMO
Sintaxis
BEGIN
Sentencias a ejecutar
END;
GO
Ejemplo 4
BEGIN
END;
GO
FUNCIONES
Función Escalar
Sintaxis
Ejemplo 5
suma
-----------
80
Sintaxis
Ejemplo 6
USE RH;
GO
Sintaxis
Ejemplo 7
USE RH;
GO
PROCEDIMIENTOS
Sintaxis
END;
USE EDUCA;
GO
EXEC dbo.usp_lista_cursos;
GO
USE EDUCA;
GO
BEGIN
DECLARE @precio money;
EXEC dbo.usp_precio 3, @precio OUT;
PRINT CONCAT( 'PRECIO: ', @precio );
END;
GO
PRECIO: 1815.00
ELEMENTOS DE PROGRAMACIÓN
Variables
Sintaxis:
DECLARE
@nombre_variable [AS] data_type [ = value ] [ , ... ]
Sentencia de asignación
Instrucción SET
Sentencia SELECT
EJERCICIOS PROPUESTOS
A continuación, tienes una lista de ejercicios propuestos que debes desarrollar con un
compañero de clase.
3. Desarrolle una función que dado el código de un curso reporte los alumnos
que tienes saldo pendiente. Base de datos EDUCA.
Capítulo 4
ESTRUCTURAS DE CONTROL
BLOQUE
Sintaxis
BEGIN
sentencias
END;
ESTRUCTURAS CONDICIONALES
Estructura: IF
Sintaxis
IF expresión_logica
{ sentencia | bloque }
[ ELSE
{ sentencia | bloque } ]
Ejercicio 1
CASE expresión_entrada
WHEN expresion1 THEN resultado1
[ ...n ]
[ ELSE resultado_else ]
END;
CASE
WHEN expresión_logica_1 THEN resultado1
[ ...n ]
[ ELSE resultado_else ]
END;
Ejercicio 3
Desarrollar una función que simule una calculadora para las operaciones básicas:
Suma, Resta, Multiplicación y División.
Ejercicio 4
Desarrollar una función que me permita averiguar a qué estación del año corresponde
una fecha.
Ejercicio 5
Ejercicio 7
ESCALA % BONIFICACIÓN
BUENO 50%
REGULAR 70%
BAJO 100%
Desarrollar una función que calcule el promedio de 4 notas, pero que solo considere
las 3 mejores.
ESTRUCTURAS DE BUCLE
Estructura WHILE
Sintaxis
WHILE expresión_lógica
sentencia | bloque ;
Sentencia BREAK
Sintaxis
BREAK;
Sentencia CONTINUE
Sintaxis
CONTINUE;
Sentencia GOTO
Etiqueta
ETIQUETA:
Salto incondicional
GOTO ETIQUETA;
Ejercicio 9
Capítulo 5
GESTIÓN DE DATOS
INSERTANDO DATOS
Sentencia INSERT
USE RH;
GO
USE EDUCA;
GO
USE EDUCA;
GO
USE EDUCA;
GO
Para ver las filas que se están insertando debemos utilizar la cláusula OUTPUT:
▪ Código de departamento
▪ Nombre de departamento
▪ Cantidad de trabajadores
Ejercicio 2
En la base de datos EDUCA crear la tabla RESUMEN que permita registrar la
siguiente información por curso:
▪ Cantidad de matriculados
ACTUALIZANDO DATOS
Sentencia UPDATE
USE EDUCA;
GO
UPDATE dbo.CURSO
SET cur_precio = ROUND(cur_precio * 1.10,0)
USE EDUCA;
GO
UPDATE dbo.CURSO
SET cur_vacantes = cur_vacantes + 2,
cur_precio = ROUND(cur_precio * 1.10,0)
USE EDUCA;
go
cur_id cur_precio
----------- ---------------------
2 1210,00
UPDATE dbo.CURSO
SET cur_precio = 1500.00
WHERE cur_id = 2;
cur_id cur_precio
----------- ---------------------
2 1500,00
Cuando se usa una cláusula TOP (n) con UPDATE, la operación de actualización se
realiza en una selección aleatoria de un número de filas 'n'.
USE RH;
go
(5 filas afectadas)
Si necesita usar TOP para aplicar actualizaciones por orden cronológico, o por algún
otro criterio de ordenamiento, debe utilizarla junto con ORDER BY en una subconsulta.
USE RH;
go
UPDATE dbo.empleado
SET sueldo = sueldo * 1.10
OUTPUT deleted.idempleado, deleted.sueldo old, inserted.sueldo new
FROM (SELECT TOP 5 idempleado FROM dbo.empleado
order by sueldo asc) AS t
WHERE dbo.empleado.idempleado = t.idempleado;
(5 filas afectadas)
USE EDUCA;
GO
(2 filas afectadas)
En el siguiente ejemplo se está utilizando la base de datos EDUCA para crear la tabla
INGRESOS, el propósito de esta tabla es almacenar el importe de la suma de los
ingresos por curso. Se está utilizando una subconsulta para actualizar la columna
importe.
use EDUCA;
go
(6 filas afectadas)
update dbo.INGRESOS
set importe = (select SUM(pag_importe)
from dbo.PAGO
where dbo.INGRESOS.cur_id = dbo.PAGO.cur_id);
go
(6 filas afectadas)
Reto
Cuál sería la modificación a la sentencia UPDATE para que no grabe valores nulos en
la columna importe.
Ejercicio 3
En la base de datos RH, a la tabla cargo agregarle una columna de nombre EMPS,
luego utilizando una sentencia UPDATE con subconsulta en esta columna EMPS debe
guardar la cantidad de empleados por cargo.
ELIMINANDO FILAS
Sentencia DELETE
USE EDUCA;
GO
De la tabla CURSOS2 se está eliminando todos los cursos que no tienen ningún
alumno matriculado. Finalmente se está eliminando la tabla CURSOS2.
USE EDUCA;
go
(6 filas afectadas)
(4 filas afectadas)
USE EDUCA;
go
(6 filas afectadas)
(1 filas afectadas)
(5 filas afectadas)
Caso 1
En el siguiente ejemplo se está eliminado 5 empleados de manera aleatoria de la tabla
EMP2 que se está creando para propósitos de la demostración en la base de datos
RH.
use rh;
go
emps
-----------
22
(1 filas afectadas)
idempleado nombre
---------- --------------------------------------------------
E0001 Gustavo
E0002 Claudia
E0003 Sergio
E0004 Mariela
E0005 Roberto
(5 filas afectadas)
emps
-----------
(1 filas afectadas)
Caso 2
Este caso es similar al Caso 1, la diferencia está en que se eliminan los 5 empleados
que tienen los mejores sueldos.
use rh;
go
emps
-----------
22
(1 filas afectadas)
(5 filas afectadas)
emps
-----------
17
(1 filas afectadas)
Ejercicio 4
En la base de datos RH crear una tabla de empleados auxiliar EMP2 con todo el
contenido de la tabla EMPLEADO para desarrollar este ejercicio.
Luego proceda a eliminar de la tabla EMP2 todos los empleados cuyo sueldo se
encuentra fuera del rango según el cargo que desempeña.
COMBINANDO DATOS
Sentencia MERGE
USE EDUCA;
GO
En el resultado que usted verá en podrá comprobar que algunas filas se actualizaron
y otras filas se insertaron como nuevas.
En el listado anterior también se puede verificar las nuevas filas, así como las
actualizaciones realizadas.
USE RH;
GO
GESTIÓN DE TRANSACCIONES
Definición
Una transacción es un grupo de acciones que hacen transformaciones consistentes
en las tablas preservando la consistencia de la base de datos. Una base de datos está
en un estado consistente si obedece todas las restricciones de integridad definidas
sobre ella. Los cambios de estado ocurren debido a actualizaciones, inserciones, y
eliminaciones de información. Por supuesto, se quiere asegurar que la base de datos
nunca entre en un estado de inconsistencia. Sin embargo, durante la ejecución de una
transacción, la base de datos puede estar temporalmente en un estado inconsistente.
El punto importante aquí es asegurar que la base de datos regresa a un estado
consistente al fin de la ejecución de una transacción.
Atomicidad
Una transacción constituye una unidad atómica de ejecución y se ejecuta exactamente
una vez; o se realiza todo el trabajo o nada de él en absoluto.
Coherencia
Una transacción mantiene la coherencia de los datos, transformando un estado
coherente de datos en otro estado coherente de datos. Los datos enlazados por una
transacción deben conservarse semánticamente.
Aislamiento
Una transacción es una unidad de aislamiento y cada una se produce aislada e
independientemente de las transacciones concurrentes. Una transacción nunca debe
ver las fases intermedias de otra transacción.
Durabilidad
Una transacción es una unidad de recuperación. Si una transacción tiene éxito, sus
actualizaciones persisten, aun cuando falle el equipo o se apague. Si una transacción
no tiene éxito, el sistema permanece en el estado anterior antes de la transacción.
Tipos de Transacciones
Una conexión de SQL Server funciona en modo de confirmación automática hasta que
una instrucción BEGIN TRANSACTION inicia una transacción explícita. Cuando la
transacción explícita se confirma o revierte, SQL Server vuelve al modo de
confirmación automática.
▪ BEGIN TRANSACTION
▪ COMMIT TRANSACTION
▪ ROLLBACK TRANSACTION
Borra una transacción en la que se han encontrado errores. Todos los datos
modificados por la transacción vuelven al estado en el que estaban al inicio de la
transacción. Se liberan los recursos ocupados por la transacción.
Transacciones implícitas
Cuando una conexión funciona en modo de transacciones implícitas, SQL Server
Database Engine (Motor de base de datos de SQL Server) inicia automáticamente una
nueva transacción después de confirmar o revertir la transacción actual. No tiene que
realizar ninguna acción para establecer el inicio de una transacción, sólo tiene que
confirmar o revertir cada transacción. El modo de transacciones implícitas genera una
cadena continua de transacciones.
Capítulo 6
CONTROL DE ERRORES
CONTROL DE ERRORES
Variable: @@ROWCOUNT
Devuelve el número de filas afectadas por la última instrucción. Si el número de filas
es mayor de 2 mil millones, use ROWCOUNT_BIG.
@@ROWCOUNT
Función: ROWCOUNT_BIG ( )
Devuelve el número de filas afectadas por la última instrucción ejecutada. Esta función
actúa como @@ROWCOUNT, pero el tipo de valor devuelto de ROWCOUNT_BIG es
bigint.
ROWCOUNT_BIG ( )
Variable: @@ERROR
Devuelve el número de error de la última instrucción Transact-SQL ejecutada.
@@ERROR
MANEJO DE EXCEPCIONES
Estructura TRY/CATCH
Una mejora importante que tenemos en SQL Server es el manejo de errores que ahora
es posible en T-SQL con los bloques TRY/CATCH, sin olvidar la sintaxis que
utilizamos para las transacciones.
Sintaxis:
BEGIN TRY
BEGIN TRANSACTION;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
–- Código para mostrar el mensaje de la excepción
END CATCH;
Para poder acceder a la información del error tenemos las siguientes funciones:
BEGIN TRY
DECLARE @TOTAL INT;
SET @TOTAL = 20;
SELECT @TOTAL/0
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS Numero_de_Error,
ERROR_SEVERITY() AS Gravedad_del_Error,
ERROR_STATE() AS Estado_del_Error,
ERROR_PROCEDURE() AS Procedimiento_del_Error,
ERROR_LINE() AS Linea_de_Error,
ERROR_MESSAGE() AS Mensaje_de_Error;
END CATCH;
GO
BEGIN TRY
SELECT * FROM TablaNoExiste;
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrorNumber,
ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO
USE EDUCA;
GO
BEGIN TRY
EXECUTE usp_ProcEjemplo;
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrorNumber,
ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO
ErrorNumber ErrorMessage
--------- --------------------------------------------------------------
208 El nombre de objeto 'TablaNoExiste' no es válido.
(1 filas afectadas)
Sintaxis
BEGIN TRY
-- Bloque a controlar
END TRY
BEGIN CATCH
-- Proceso de control
REQUERIMIENTOS A RESOLVER
Requerimiento 1
Base de Datos: EDUTEC
Se necesita un procedimiento que permita generar un nuevo ciclo, las condiciones son
las siguientes:
1. Por cada año existen doce ciclos, uno por mes, por ejemplo: 2020-01, 2020-
02, 2020-03, etc.
Requerimiento 2
Base de Datos: EDUTEC
Se necesita un procedimiento para registrar una nueva matricula, las condiciones son
las siguientes:
Se necesita un procedimiento para registrar un nuevo pago, las condiciones son las
siguientes:
3. Si el pago es en una cuota, debe ser por el total del costo del curso.
4. Si el pago es la primera cuota, debe ser mínimo por el 30% del costo del
curso.
Capítulo 7
TRABAJANDO CON CURSORES
TRABAJANDO CON CURSORES
Declaración
Sintaxis ISO
Ejemplo 17
Sintaxis
Ejemplo 18
OPEN cur_cursos;
Sintaxis
FETCH
[ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar } ]
FROM ]
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }
[ INTO @variable_name [ ,...n ] ]
Ejemplo 19
Sintaxis
Ejemplo 20
CLOSE cur_cursos;
Sintaxis
Ejemplo 21
DEALLOCATE cur_cursos;
OPEN cur_cursos;
CLOSE cur_cursos;
DEALLOCATE cur_cursos;
CONTROL DE UN CURSOR
Variable: @@FETCH_STATUS
Devuelve el estado de la última instrucción FETCH emitida para cualquier cursor
abierto en ese momento por la conexión.
Sintaxis
@@FETCH_STATUS
Valor devuelto
Valor Descripción
devuelto
0 La instrucción FETCH se ejecutó correctamente.
-1 La instrucción FETCH no se ejecutó correctamente o la fila
estaba más allá del conjunto de resultados.
-2 Falta la fila capturada.
OPEN cur_cursos;
WHILE( @@FETCH_STATUS = 0 )
BEGIN
PRINT CONCAT(@cur_id, ' - ', @cur_nombre, ' - ', @cur_precio);
FETCH NEXT FROM cur_cursos
INTO @cur_id, @cur_nombre, @cur_precio;
END;
CLOSE cur_cursos;
DEALLOCATE cur_cursos;
Sintaxis
@@CURSOR_ROWS
Valor devuelto
Valor
Descripción
devuelto
-m El cursor se rellena de forma asincrónica. El valor devuelto (-m) es
el número de filas que el conjunto de claves contiene actualmente.
-1 El cursor es dinámico. Como los cursores dinámicos reflejan todos
los cambios, el número de filas correspondientes al cursor cambia
constantemente. Nunca se puede afirmar que se han recuperado
todas las filas que correspondan.
0 No se han abierto cursores, no hay filas calificadas para el último
cursor abierto, o éste se ha cerrado o su asignación se ha
cancelado.
n El cursor está completamente relleno. El valor devuelto (n) es el
número total de filas del cursor.
OPEN cur_cursos;
CLOSE cur_cursos;
DEALLOCATE cur_cursos;
GO
CURSOR_ROWS = 0
CURSOR_ROWS = -1
Sintaxis
CURSOR_STATUS
(
{ 'local' , 'cursor_name' }
{ 'global' , 'cursor_name' }
| { 'variable' , 'cursor_variable' }
)
Valor devuelto
Valor
Nombre de cursor Variable de cursor
devuelto
1 El conjunto de resultados del El cursor asignado a esta variable está
cursor tiene al menos una fila. abierto.
USE EduTec;
GO
-- Crea un cursor
-- Cursor cerrado
-- Cursor abierto
OPEN cur_demo;
SELECT CURSOR_STATUS('global','cur_demo') AS 'Después de abrir';
-- Cursor cerrado
CLOSE cur_demo;
SELECT CURSOR_STATUS('global','cur_demo') AS 'Después de cerrar';
-- Remover el cursor
DEALLOCATE cur_demo;
GO
Después de declarar
-------------------
-1
(1 filas afectadas)
Después de abrir
----------------
1
(1 filas afectadas)
Después de cerrar
-----------------
-1
(1 filas afectadas)
BUCLE DE EXTRACCIÓN
Plantilla
-- Proceso
Ejemplo 26
El siguiente script muestra la cantidad de empleados que hay en cada departamento:
USE RH;
GO
OPEN cur_depts;
CLOSE cur_depts;
DEALLOCATE cur_depts;
GO
EJERCICIOS
Ejercicio 12
En la base de datos RH, crear un procedimiento que de cada departamento muestre
el trabajador con menor salario y el trabajador con mayor tiempo de servicio. Se deben
mostrar los empates.
Ejercicio 13
En la base de EDUCA, crear un procedimiento que muestre el alumno con mayor nota.
Se deben mostrar los empates.
La sintaxis para crear una variable de tabla es similar a la de crear una tabla normal,
se utiliza la palabra clave DECLARE y el nombre de tabla, anteponiendo el símbolo
@.
Sintaxis:
(3 filas afectadas)
Las tablas temporales locales son eliminadas con el comando DROP o se eliminan
automáticamente de memoria cuando se cierra la conexión del usuario.
Ejemplo 28
Creación de la tabla temporal.
-- Insertando datos
INSERT INTO #ResumenVentas VALUES
(1, 'Refrigeradora', 45657.0),
(2, 'Televisor', 65350.0),
(3, 'Laptop', 145640.0);
GO
Resultado obtenido.
(3 filas afectadas)
-- Eliminando la tabla
DROP TABLE #ResumenVentas;
GO
Para que el ejemplo funcione las instrucciones deben ejecutarse en la misma sesión.
-- Insertando datos
INSERT INTO ##Autores(nombre) VALUES
('Gustavo Coronel'),
('Sergio Matsukawa'),
('Ricardo Marcelo');
GO
El resultado es el siguiente.
id nombre
----------- ------------------------------
1 Gustavo Coronel
2 Sergio Matsukawa
3 Ricardo Marcelo
(3 filas afectadas)
EJERCICIOS
Ejercicio 14
En la base de datos RH, crear un procedimiento que de cada departamento muestre
lo siguiente:
▪ La cantidad de empleados
▪ Planilla sin comisión
▪ Planilla con comisión
Ejercicio 15
En la base de datos EDUTEC, crear un procedimiento que reciba como parámetro un
periodo, por ejemplo 2010, 2011, 2012, etc. y reporte por cada ciclo en el periodo los
siguientes datos:
▪ Cantidad de cursos programados
▪ Cantidad de alumnos proyectados
▪ Cantidad de alumnos matriculados
▪ Importe proyectado (de alumnos proyectados)
▪ Importe real (de alumnos matriculados)
Capítulo 8
GESTIÓN DE TRIGGERS
INTRODUCCIÓN
Los triggers DDL se pueden usar para auditar las operaciones de base de datos o de
servidor que crean, modifican o eliminan objetos de base de datos o garantizar que
las instrucciones DDL aplican las reglas de negocios antes de que se ejecuten.
Importante
Para mayor información sobre los eventos DDL consultar la siguiente dirección:
http://msdn.microsoft.com/es-es/library/bb522542.aspx
Por ejemplo, un trigger DDL se puede activar si se ejecuta una instrucción como
ALTER SERVER CONFIGURATION o si se elimina una tabla mediante DROP
TABLE.
Los triggers DDL solo se activan cuando se ejecutan las instrucciones DDL que los
desencadenan. Los triggers DDL no se pueden usar como triggers INSTEAD OF. Los
triggers DDL no se activan como respuesta a eventos que afectan a procedimientos
almacenados y tablas temporales, ya sean locales o globales.
A diferencia de los triggers DML, los triggers DDL no tienen como ámbito los
esquemas. Por tanto, las funciones como OBJECT_ID, OBJECT_NAME,
OBJECTPROPERTY y OBJECTPROPERTYEX no se pueden usar para efectuar
consultas en metadatos sobre triggers DDL. En su lugar se debe usar las vistas de
catálogo.
Por ejemplo, un trigger DDL creado para activarse como respuesta al evento
CREATE_TABLE se activará siempre que se produzca un evento CREATE_TABLE
en la base de datos o en la instancia de servidor. Un trigger DDL creado para activarse
como respuesta a un evento CREATE_LOGIN se activará únicamente cuando se
produzca un evento CREATE_LOGIN en la instancia de servidor.
Ejemplo 30
En el siguiente ejemplo, el trigger DDL TR_SEGURIDAD se activará siempre que se
produzca un evento DROP_TABLE o ALTER_TABLE en la base de datos, impidiendo
que se elimine o modifique una tabla.
USE EDUCA;
GO
Eliminemos el desencadenante:
Ejemplo 31
En el siguiente ejemplo, un trigger DDL imprime un mensaje si se produce algún
evento CREATE_DATABASE en la instancia de servidor actual. El ejemplo usa la
función EVENTDATA para recuperar el texto de la instrucción Transact-SQL
correspondiente.
USE master;
GO
Eliminemos el desencadenante:
Los triggers DDL de base de datos se almacenan como objetos en la base de datos
donde se crean. Se puede utilizar la vista de catálogo sys.triggers para obtener
información de estos triggers.
Los triggers DDL del servidor se almacenan como objetos en la base de datos master.
Sin embargo, puede obtenerse información sobre los triggers DDL de servidor si se
consulta la vista de catálogo sys.server_triggers en cualquier contexto de base de
datos.
CREATE TRIGGER . . .
ALTER TRIGGER . . .
Cuando el trigger DDL se elimina, se quita de la base de datos actual. Los objetos o
datos incluidos en el ámbito del trigger DDL no se ven afectados.
EJEMPLOS
-- Tabla de auditoria.
CREATE TABLE dbo.DDLEvents
(
EventDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
EventType NVARCHAR(64),
EventDDL NVARCHAR(MAX),
EventXML XML,
DatabaseName NVARCHAR(255),
SchemaName NVARCHAR(255),
ObjectName NVARCHAR(255),
HostName VARCHAR(64),
IPAddress VARCHAR(32),
ProgramName NVARCHAR(255),
LoginName NVARCHAR(255)
);
INSERT AuditDB.dbo.DDLEvents
(
EventType,
EventDDL,
EventXML,
DatabaseName,
SchemaName,
ObjectName,
HostName,
IPAddress,
ProgramName,
LoginName
)
SELECT
@EventData.value('(/EVENT_INSTANCE/EventType)[1]', 'NVARCHAR(100)'),
@EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(MAX)'),
@EventData,
DB_NAME(),
@EventData.value('(/EVENT_INSTANCE/SchemaName)[1]', 'NVARCHAR(255)'),
@EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(255)'),
HOST_NAME(),
@ip,
PROGRAM_NAME(),
SUSER_SNAME();
END;
GO
Consultando el log.
-- Creando la tabla
USE master;
GO
USE master;
GO
IF EXISTS ( SELECT *
FROM sys.server_triggers
WHERE name = 'trgLogServerSecurityEvents' )
DROP TRIGGER trgLogServerSecurityEvents ON ALL SERVER;
GO
USE RH;
GO
USE master;
GO
EXEC master..sp_addsrvrolemember
@loginame = N'intruso',
@rolename = N'sysadmin';
GO
USE RH;
GO
Capítulo 9
PRACTICAS CALIFICADAS
PRACTICA CALIFICADA 1
Problema 1
Desarrollar una función que permita encontrar el mayor de 5 números.
Problema 2
Desarrollar un procedimiento para calcular el promedio de un estudiante, se sabe que
son 5 notas y se promedian las 4 mejores.
Problema 3
Desarrollar un procedimiento que permita calcular el sueldo neto de un trabajador
según el número de horas trabajadas.
Si excede las 120 horas se le pagará 50% más por hora, solo por las horas que
exceden las 120 horas.
Problema 4
Desarrollar una función que lea el día y mes de nacimiento de una persona y determine
a que signo pertenece.
PRACTICA CALIFICADA 2
Problema 5
Desarrollar una función que permita convertir un número de base 10 a base 16.
Problema 6
Un padre con la intensión de motivar el estudio en su Hijo, le dice que será
compensado según su promedio final del ciclo.
Por ejemplo:
Si el promedio es: 13
Problema 7
Desarrollar un procedimiento que permita mostrar la tabla de multiplicar de un número
N. El valor de N se debe ingresar como un parámetro de entrada.
Problema 8
Desarrollar una función que permita calcular la potencia de un número, de tener 2
parámetros, uno para la base y otro para el exponente.
PRACTICA CALIFICADA 3
Base de datos
La base de datos para esta práctica es EUREKABANK.
Problema 9
Desarrollar un procedimiento para registrar un nuevo cliente.
Problema 10
Desarrollar un procedimiento para registrar un deposito en una cuenta especifica.
Problema 11
Desarrollar un procedimiento para registrar un retiro de una cuenta especifica.
Problema 12
Desarrollar un procedimiento para registrar una transferencia.
Se debe verificar que las cuentas origen y destino sean de la misma moneda.
PRACTICA CALIFICADA 4
Problema 13
Base de datos: EUREKABANK
SALDO SALDO
CODIGO NOMBRE
SOLES DOLARES
001 Sipan ##,###.## ##,###.##
002 Chan Chan ##,###.## ##,###.##
003 Los Olivos ##,###.## ##,###.##
004 Pardo ##,###.## ##,###.##
005 Misti ##,###.## ##,###.##
006 Machupicchu ##,###.## ##,###.##
007 Grau ##,###.## ##,###.##
Donde:
CURSOS RELACIONADOS
Para contactarte con algún representante del CEPS-UNI tienes la siguiente URL:
https://www.ceps.uni.edu.pe/contacto/
A continuación, tienes la lista de cursos relaciones que te pueden interesar: