Академический Документы
Профессиональный Документы
Культура Документы
El resultado de la compilacin de las instrucciones en DDL es un conjunto de tablas denominadas Diccionario de Datos o
Directorio de Datos.
Recuperacin de datos.
Insercin de datos.
Eliminacin de datos.
Modificacin de datos.
Atributos/Claves:
Clave Primaria: un atributo o grupo de atributos que identifican unvocamente una instancia de una entidad.
Clave Alterna: Un atributo o conjunto de atributos que identifican unvocamente cada instancia, pero que no forman parte
de la Clave Primaria.
Clave Fornea: Una clave primaria de una entidad padre que es aportada a una entidad hijo, a travs de una relacin.
SENTENCIAS DDL
CREATE (creacin):
Use nombreBD;
Nos permitir indicar que usaremos esa bd para las sentencias que se ejecutarn en adelante.
Create Table;
Crea una nueva tabla en la base se pueden incluir los siguientes parmetros:
Nombre de la tabla.
o Debe ser tan descriptivo como sea posible (sin que sea excesivamente largo).
o Hasta 30 caracteres.
o Debe empezar por una letra.
o Puede contener letras, nmeros y caracteres especiales ($,#,_).
Nombre de cada columna.
Tipo de datos de cada columna.
Restricciones de clave primaria y clave fornea sobre otras tablas.
Ejemplo:
Tipos de restriccin:
Primary Key: Columnas de clave primaria. Una tabla puede tener solo un constraint PRIMARY KEY pero puede tener
diversos constraints UNIQUE.
Not null: Valores no nulos.
Unique: Columnas con valores nicos.
Check: Chequeos de integridad ms complejos. Una columna puede tener mltiples constraints CHECK las cuales
pueden referenciarse en la definicin de la columna.
Foreign key/reference: Integridad referencial (clave fornea o foreign key).
Ejemplos:
CREATE TABLE Productos (prodCod INTEGER PRIMARY KEY CHECK(prodCod between 0 and 100),
nombre VARCHAR(50) UNIQUE,
peso DECIMAL(9,2),
descripcion VARCHAR(200) NOT NULL);
Constraint:
Las restricciones tambin se pueden declarar como Constraint con un nombre, esto facilita la modificacin o eliminacin de
las mismas posterior a la creacin de la tabla:
Constraint nombreCT tipoRestriccion (atributo y o condicin);
Ejemplo:
CREATE TABLE Productos (prodCod INTEGER,
nombre VARCHAR(50),
peso DECIMAL(9,2),
descripcion VARCHAR(200) NOT NULL,
CONSTRAINT prodCod_pk PRIMARY KEY(prodCod) ,
CONSTRAINT prodCod_entre CHECK(prodCod between 0 and 100),
CONSTRAINT nombre_u UNIQUE(nombre));
Un caso particular:
Si un atributo est definido como unique, pero admite nulos, podemos encontrar el valor null en la columna ms de una
vez?. CUIDADO SQL SERVER!!!
Atributo Identity
Genera valores secuenciales que por defecto se inician en 1 y se incrementan en 1.
Se utiliza generalmente en campos correspondientes a cdigos de identificacin para generar valores nicos para
cada nuevo registro que se inserta.
Slo puede haber un campo "identity" por tabla.
Cuando un campo tiene el atributo "identity" no se puede ingresar valor para l, se inserta automticamente
tomando el ltimo valor como referencia.
Se inicia:
IDENTITY [ (seed , increment ) ]
Ejemplo:
CREATE TABLE Productos (prodCod INTEGER PRIMARY KEY IDENTITY(50,1),
nombre VARCHAR(50),
peso DECIMAL(9,2),
descripcion VARCHAR(200) );
ALTER (modificacin):
Permite modificar la definicin de una tabla existente como agregar o eliminar columnas y constraint. Cambiar ancho del
dato, etc.
Agrega una nueva columna a la tabla product. Se debe especificar tipo de dato. En este caso se debe tener en cuenta que la
tabla en cuestin no contenga datos ya que el nuevo atributo es not null.
ALTER TABLE Empleados ADD CONSTRAINT Emp_Salario_Min CHECK (Emp_Salario > 0);
Otros ejemplos:
Aadir una columna a una tabla:
ALTER TABLE T_PEDIDOS ADD TEXTOPEDIDO Varchar2(35);
Por ejemplo:
Drop table Empleados; //Borra toda la tabla, siempre que no hayan claves forneas en otras tablas que apunten a
columnas de sta.
ALTER TABLE Empleados DROP CONSTRAINT Emp_Fk_Dep; //Borra la constraint con ese nombre.
ALTER TABLE Departamentos DROP PRIMARY KEY; // Borra la pk definida para esa tabla.
Indices
Un ndice es una estructura de memoria secundaria, que permite el acceso directo a las filas de una tabla. Los ndices se
utilizan para mejorar el rendimiento de las operaciones sobre una tabla.
El uso de ndices intenta bajar la cantidad de lecturas en la consulta. Realiza un reordenamiento de los datos segn su tipo
(string a-z, etc). Pueden estar conformados por ms de un atributo.
En general mejoran el rendimiento las SELECT y empeoran (mnimamente) el rendimiento de los INSERT, UPDATE y los
DELETE.
Cuando creamos una restriccin "primary key" o "unique" a una tabla, SQL Server automticamente crea un ndice sobre el
campo (o los campos) de la restriccin.
Cuando crearlos:
La columna es usada frecuentemente en la clusula WHERE o en condiciones de unin o join.
La columna contiene un amplio rango de valores.
La columna contiene un gran nmero de valores nulos (ya que no se almacenan).
Dos o ms columnas son usadas juntas con frecuencia en la clusula WHERE o en condiciones de unin o join.
Si la tabla es grande y se espera que la mayora de las consultas recuperen poca cantidad de filas
En clase se utilizar el siguiente criterio: Para cada FK que no est en la Pk o que no ocupe el primer lugar de la pk.
Cuando no crearlos:
Cuando la tabla es pequea.
Las columnas no son frecuentemente usadas como una condicin en las consultas.
La tabla se actualiza con frecuencia. Si tiene una o ms ndices en una tabla, las sentencias DML que acceden a la
tabla, toman relativamente ms tiempo, debido al mantenimiento de los ndices.
Sintaxis:
Ejemplo:
A(A1,A2,A3)
B(B1,A1,B2,B3) CREATE INDEX ind1 on B(A1);
C(C1,B1,A1,C2) CREATE INDEX ind2 on C(B1,A1);
D(B1,A1,D1,D2)
E(E1, E2, E3, A1) CREATE INDEX ind3 on E(A1);
F(F1, F2, F3, F4)
G(F1,E1,F2, G1) CREATE INDEX ind4 on G(E1);
CREATE INDEX ind5 on G(F2);
SENTENCIAS DML
Tupla:
Una tupla se define como una funcin finita que asocia unvocamente los nombres de los atributos de una relacin con los
valores de una instanciacin de la misma. En forma simple: es una fila de una tabla relacional.
El orden en el que se asignen los valores en la clusula VALUES tiene que coincidir con el orden y tipo en que se definieron
las columnas en la creacin del objeto tabla, dado que los valores se asignan por posicionamiento relativo.
Es necesario que por lo menos se asignen valores a todas aquellas columnas que no admiten valores nulos en la tabla, en el
caso de que exista un campo identity, saltearemos el valor para ese campo.
Sintaxis:
En los casos en que una o varias columnas de una tabla permitan valores nulos, se puede indicar a que columnas especficas
se le quiere asignar los datos:
Sintaxis:
Ejemplos:
Actualizar todas las filas de una columna:
UPDATE Inscripciones SET costo = 5000
Sintaxis:
DELETE FROM nombreTabla WHERE condicin; //Sin la condicin, borra todas las filas
Ejemplos:
DELETE FROM Estudiantes WHERE estudianteCod = 1;
Sintaxis:
SELECT columna1, columna2, FROM tabla1, tabla2, WHERE condicin;
SQL permite valores duplicados en los resultados de las consultas. Para forzar la eliminacin de duplicados, incluya distinct
luego de select.
SELECT DISTINCT columna1,columna2
FROM nombreTabla
WHERE condicion AND|OR condicion
ORDER BY nombreColumna ASC | DESC
Ejemplos:
SELECT costo FROM INSCRIPCIONES
WHERE idEstudiante = 5 and idCurso = 3;
Mostrar los nombres de todas las sucursales que dieron prstamos pero sin mostrar nombres repetidos
SELECT DISTINCT Suc_Nombre
FROM prestamos;
El select puede contener expresiones aritmticas, +, , *, /, estas operan sobre los contenidos de los campos
Ejemplo:
Retorna los datos de los prstamos pero con los montos multiplicados por 100.
SELECT prest_num, suc_nom, monto * 100
FROM prestamos;
Mostrar todos los datos de las inscripciones, pero con el COSTO expresado en dlares.
SELECT estudianteCod, cursoCod, costo / 19.5, fchInsc
FROM INSCRIPCIONES;
SQL incluye la clusula between para poder obtener valores entre un rango determinado.
Ejemplo:
Mostrar los numeros de prstamo cuyo monto estn entre $90,000 y $100,000 ( $90,000 y $100,000)
SELECT prest_num
FROM prestamos
WHERE monto between 90000 and 100000;
Ordenamiento de duplas
La clusula ORDER BY permite indicar el campo por el cual se ordena el resultado. Se indica el orden (ASC o DESC).
Ejemplo:
Dar los id de cursos que tienen inscripciones, pero ordenados en forma ascendente.
SELECT cursoCod FROM inscripciones
ORDER BY cursoCodASC;
Dar los id de cursos que tienen inscripciones, ordenados en forma asc, mostrando cada curso como mximo una vez.
SELECT DISTINCT cursoCod FROM inscripciones
ORDER BY cursoCod;
Para mostrar la informacin repartida en varias tablas es que utilizamos las consultas combinadas o JOINS.
Tipos de Join
Para expliar los siguientes conceptos usaremos estas tablas de ejemplo:
Tabla Empleado
Tabla Departamento
Apellido IdDepartamento
NombreDepartamento IdDepartamento
Andrade 31
Ventas 31
Jordn 33
Ingeniera 33
Steinberg 33
Produccin 34
Rbinson 34
Mercadeo 35
Zolano 34
Gaspar 36
Ejemplo:
INNER JOIN implcita:
SELECT Campos
FROM empleado, departamento
WHERE empleado.IDDepartamento = departamento.IDDepartamento
Resultado:
Zolano 34 Produccin 34
Jordn 33 Ingeniera 33
Rbinson 34 Produccin 34
Steinberg 33 Ingeniera 33
Andrade 31 Ventas 31
El empleado Gaspar y el departamento de Mercadeo no son presentados en los resultados ya que ninguno de
stos tiene registros correspondientes en la otra tabla. No existe un departamento con nmero 36 ni existe un
empleado con nmero de departamento 35.
NATURAL JOIN: Es un caso especial de INNER JOIN que compara por cuenta propia la equivalencia de columnas
con el mismo nombre y tipo de dato entre dos o ms tablas para hacer la combinacin de ambas. Hay que tener
especial cuidado con su uso, pues puede producir resultados ambiguos o generar problemas si se aaden, quitan, o
renombran las columnas.
Sintaxis:
SELECT * FROM empleado NATURAL JOIN departamento
El resultado es un poco diferente al del ejemplo D, ya que esta vez la columna IdDepartamento se muestra sola una vez en
la tabla resultante.
Zolano 34 Produccin
Jordn 33 Ingeniera
Rbinson 34 Produccin
Steinberg 33 Ingeniera
Andrade 31 Ventas
ATENCIN!: SQL SERVER no soporta NATURAL JOIN. Oracle tiene un bug en las versiones 9i y 10g al utilizar
NATURAL JOIN. Recomendacin: no utilizar NATURAL JOIN
Mediante esta operacin no se requiere que cada registro en las tablas a tratar tenga un registro equivalente en la otra
tabla. El registro es mantenido en la tabla combinada si no existe otro registro que le corresponda.
Este tipo de operacin se subdivide dependiendo de la tabla a la cual se le admitirn los registros que no tienen
correspondencia, ya sean de tabla izquierda, de tabla derecha o combinacin completa.
Sintaxis:
LEFT OUTER JOIN: El resultado de esta operacin siempre contiene todos los registros de la tabla de la izquierda (la
primera tabla que se menciona en la consulta), aun cuando no exista un registro correspondiente en la tabla de la
derecha para uno de la izquierda.
Ejemplo:
Mostrar el cdigo y nombre del estudiante, y en caso de que est inscripto a algn curso, mostrar los cdigos de
esos cursos.
SELECT Estudiantes.estudianteCod, Estudiantes.nombre, Inscripciones.cursoCod
FROM Estudiantes LEFT OUTER JOIN Inscripciones
ON Estudiantes.estudianteCod = Inscripciones.estudianteCod;
Resultado:
Empleado.Apellido Empleado.IDDepartamento Departamento.NombreDepartamento Departamento.IDDepartamento
Jordn 33 Ingeniera 33
Andrade 31 Ventas 31
Rbinson 34 Produccin 34
Zolano 34 Produccin 34
RIGHT OUTER JOIN: Esta operacin es inversa a la anterior; el resultado de esta operacin siempre contiene todos
los registros de la tabla de la derecha (la segunda tabla que se menciona en la consulta), aun cuando no exista un
registro correspondiente en la tabla de la izquierda para uno de la derecha.
Ejemplo:
Devolver la matrcula, nombre de marca, color, kms y plazas de todos los autos.
SELECT AUTOS.matricula, MARCAS.nombre, AUTOS.color, AUTOS.kms, AUTOS.plazas
FROM AUTOS LEFT JOIN MARCAS
ON AUTOS.marcaCod = MARCAS.codigo;
Resultado:
Empleado.Apellido Empleado.IDDepartamento Departamento.NombreDepartamento Departamento.IDDepartamento
Zolano 34 Produccin 34
Jordn 33 Ingeniera 33
Rbinson 34 Produccin 34
Steinberg 33 Ingeniera 33
Andrade 31 Ventas 31
FULL OUTER JOIN: Esta operacin presenta los resultados de tabla izquierda y tabla derecha aunque no tengan
correspondencia en la otra tabla. La tabla combinada contendr, entonces, todos los registros de ambas tablas y
presentar valores nulos NULLs para registros sin pareja.
Ejemplo:
SELECT *
FROM empleado
FULL OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento;
Resultado:
Empleado.Apellido Empleado.IDDepartamento Departamento.NombreDepartamento Departamento.IDDepartamento
Zolano 34 Produccin 34
Jordn 33 Ingeniera 33
Rbinson 34 Produccin 34
Steinberg 33 Ingeniera 33
Andrade 31 Ventas 31
Se utilizan:
El alias de una columna puede ir entre comillas para especificar un alias de ms de una palabra, pero el de tabla no.
Renombre de atributos:
Renombre de tablas:
SELECT ESTUDIANTES.estudianteCod,
ESTUDIANTES.nombre, INSCRIPCIONES.cursoCod
FROM ESTUDIANTES A, INSCRIPCIONES B
WHERE A.estudianteCod = B.estudianteCod;
Funciones de agregacin
COUNT(*): Contador de tuplas (cuenta valores duplicados y nulos). Con la clusula Distinct no tiene en cuenta valores nulos
ni duplicados.
Ejemplos:
Obtener el nmero total de estudiantes.
SELECT COUNT (*) FROM ESTUDIANTES;
Ejemplo:
Obtener el precio medio de los costos de inscripciones
SELECT AVG(COSTO) FROM INSCRIPCIONES;
Ejemplo:
Obtener el precio medio de los costos de inscripciones
SELECT AVG(COSTO) FROM INSCRIPCIONES;
Ejemplo:
Obtener la fecha del menor de los estudiantes.
SELECT MAX(fchNac) FROM ESTUDIANTES;
Obtener el costo mximo de las inscripciones y al mismo tiempo la fecha mxima de las inscripciones.
SELECT MAX(COSTO), MAX(fchInscripcion) FROM INSCRIPCIONES;
Ejemplo:
Obtener la fecha del mayor de los estudiantes.
SELECT MIN(fchNac) FROM ESTUDIANTES;
Algunas reglas:
Subconsultas
Una subconsulta es una sentencia SELECT que aparece dentro de otra sentencia SELECT. Normalmente se utilizan para
filtrar una clausula WHERE o HAVING con el conjunto de resultados de la subconsulta, aunque tambin pueden utilizarse en
la lista de seleccin.
Caractersticas:
La subconsulta se ejecuta en primer lugar, obteniendo el valor de la mxima fecha de nacimiento, y posteriormente
se obtienen los datos de la consulta principal.
Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal exceptuando que aparece encerrada
entre parntesis.
La subconsulta se puede encontrar en la lista de seleccin, en la clusula WHERE o en la clusula HAVING de la
consulta principal.
Restricciones:
Ejemplo:
Obtener el nombre y la fecha de nacimiento del estudiante de menor edad nacido en Montevideo.
SELECT nombre, fchNac
FROM ESTUDIANTES
WHERE ciudadNac = Montevideo AND fchNac = (SELECT MAX (fchNac)
FROM ESTUDIANTES
WHERE ciudadNac = Montevideo);
Dar el cdigo y nombre de los estudiantes que estn inscriptos a alguno de los cursos que est inscripto el estudiante
con cdigo = 1.
SELECT idEstudiante,nombre
FROM ESTUDIANTES E, INSCRIPCIONES I
WHERE E.idEstudiante = I.idEstudiante
AND E.idEstudiante <> 1 AND I.idCurso IN (SELECT idCurso FROM INSCRIPCIONES
WHERE INSCRIPCIONES.idEstudiante = 1);
Mostrar los datos de las inscripciones que tengan costo de inscripcin al curso 2 mayor a alguno de los costos de
inscripcin del curso 1.
SELECT *
FROM INSCRIPCIONES I
WHERE I.idCurso = 2 AND I.costo > ANY (SELECT costo FROM INSCRIPCIONES I1
WHERE I1.idCurso = 1);
Funcion Exist
Sirve para chequear si el resultado de una consulta anidada es vaco. Retorna verdadero cuando una subconsulta retorna al
menos una fila. Se puede utilizar la negacin del EXISTS: NOT EXISTS.
La funcin EXISTS puede ser utilizada en:
SELECT UPDATE INSERT DELETE
Ejemplo:
Dar el cdigo y nombre de los estudiantes que slo estn inscriptos al curso con cdigo = 1.
SELECT E1.idEstudiante,nombre
FROM ESTUDIANTES E1, INSCRIPCIONES I1
WHERE E1.idEstudiante = I1.idEstudiante AND I1.idCurso = 1 AND NOT EXISTS (SELECT * FROM INSCRIPCIONES I2
WHERE I2.idEstudiante = E1.idEstudiante
AND I2.idCurso <> 1);
Group By: Agrupamiento de tuplas
Es una clusula ms que se agrega al SELECT, FROM, WHERE.
Sintaxis:
Ejemplo:
Genera un grupo por cada estudianteCod distinto. De cada grupo devuelve el estudianteCod y la cantidad de tuplas de
dicho grupo. Dar para cada estudiante, la cantidad de cursos a los que est inscripto.
Ejemplo:
Dar el nmero de estudiante y los promedios de costos de sus inscripciones.
SELECT estudianteCod, avg(costo)
FROM INSCRIPCIONES
GROUP BY estudianteCod;
Reglas de sintaxis:
En una sentencia SQL que tiene clusula GROUP BY, las expresiones en el SELECT pueden ser slo:
o Atributos presentes en la clusula GROUP BY.
o Funciones de agregacin sobre atributos.
o Expresiones aritmticas que utilicen los anteriores.
El agrupamiento se realiza despus de aplicar el WHERE. O sea, sobre las tuplas que cumplen la condicin.
Por ejemplo:
Dar el cdigo de estudiante y sus promedios de costo de inscripciones, pero para los estudiantes inscriptos a ms de un
curso.
SELECT estudianteCod, avg(costo)
FROM INSCRIPCIONES
GROUP BY estudianteCod
HAVING count(*) > 1;
Dar el nmero de estudiante y su nombre para los inscriptos a ms de un curso, sobre cursos con id mayor a 1. Mostrar
el costo total de dichas inscripciones.
SELECT E.estudianteCod, E.nombre, sum(costo)
FROM INSCRIPCIONES I, ESTUDIANTES E
WHERE I.estudianteCod = E.estudianteCod AND I.cursoCod > 1
GROUP BY E.estudianteCod, E.nombre
HAVING count(*) > 1;
Vistas
Una vista es una tabla virtual que se basa en el resultado de una consulta. Sus atributos son atributos de tablas o de otras
vistas. Pueden usarse en consultas como si fueran tablas.
Para crear una vista debemos proporcionar un nombre a la vista y una sentencia SQL SELECT vlida.
Ejemplo:
Queremos ofrecer una vista sobre la tabla inscripciones en la que no aparezca el costo.
CREATE VIEW inscripciones2 AS ( SELECT estudianteCod, cursoCod, fchInsc
FROM INSCRIPCIONES);
Se puede modificar una vista sin necesidad de borrarla, para ello se utiliza la siguiente sintaxis:
Se puede borrar una vista del esquema, para ello se utiliza la siguiente sintaxis:
Los aliases opcionales, permiten asignarle nombres a las columnas de la vista. Si se omiten, las columnas tendrn el mismo
nombre que en las tablas originales (de donde se obtuvieron).
Consideraciones:
Las vistas no tienen una copia fsica de los datos, son consultas a los datos que hay en las tablas, por lo que:
o si actualizamos los datos de una vista (UPDATE), estamos actualizando realmente la tabla.
o si actualizamos la tabla (UPDATE) estos cambios sern visibles desde la vista.
Nota: no siempre podremos actualizar los datos de una vista, depender de la complejidad de la misma (restricciones de
integridad de las tablas origen incluyendo los privilegios de usuario) y del manejador de base de datos.
Transact-SQL
Es el lenguaje de programacin que proporciona SQL Server para ampliar SQL con los elementos caractersticos de los
lenguajes de programacin: variables, sentencias de control de flujo, iteraciones.
Variables:
El nombre de una variable debe comenzar por el caracter @. Debemos utilizar la palabra clave declare, seguida del
identificador y tipo de datos de la variable.
Ejemplo:
declare @nombre varchar(50)--declare declara una variable
--@nombre es el identificador de la
--variable de tipo varchar
/*Cuando asignamos variables de este ltimo modo, si la consulta SELECT devuelve ms de un registro, las variables
quedarn asignadas con los valores de la ltima fila devuelta.*/
Estructura condicional
If Else:
La estructura condicional IF permite evaluar una expresin booleana (resultado SI -NO), y ejecutar las operaciones
contenidas en el bloque formado por BEGIN END.
Case:
La estructura condicional CASE permite evaluar una expresin y devolver un valor u otro segn la siguiente sintaxis:
CASE <expresion>
WHEN <valor_expresion> THEN <valor_devuelto>
WHEN <valor_expresion> THEN <valor_devuelto>
ELSE <valor_devuelto> --Valor por defecto
END
Ejemplo:
DECLARE @ciudad varchar(100), @abCiudadvarchar(3)
SET @abCiudad= 'MVD'
SET @ciudad = (CASE @abCiudad WHEN 'MVD' THEN 'Montevideo'
WHEN 'PDU' THEN 'Paysand'
ELSE 'Otraciudad'
END)
PRINT @ciudad
While:
El bucle WHILE se repite mientras la expresin se evale como verdadera.
WHILE <expresion>
BEGIN
...
END
Ejemplo:
DECLARE @contadorint
SET @contador= 0
WHILE (@contador< 100)
BEGIN
SET @contador= @contador+ 1
PRINT 'Iteraciondel bucle' + cast(@contadorAS varchar)
END
Try-Catch:
Sintaxis: Ejemplo:
BEGIN TRY BEGIN TRY
... DECLARE @divisor int, @dividendo int, @resultado int
END TRY SET @dividendo = 100
BEGIN CATCH SET @divisor = 0 --Esta lnea provoca un error de divisin por 0
... SET @resultado = @dividendo/@divisor
END CATCH PRINT 'No hay error'
END TRY
BEGIN CATCH
PRINT 'Se ha producido un error'
END CATCH
Procedimiento:
Un procedimiento es un programa dentro de la base de datos que ejecuta una accin o conjunto de accin es especficas.
Puede ser llamado usando el nombre que se le haya asignado.
Un procedimiento tiene un nombre, un conjunto de parmetros (opcional) y un bloque de cdigo.
Si queremos que los parmetros de un procedimiento almacenado sean de entrada-salida debemos especificarlo a travs
de la palabra clave OUTPUT, tanto en la definicin del procedure como en la ejecucin.
Ejemplo:
CREATE PROCEDURE spu_ObtenerSaldoCuenta
@numCuentavarchar(20),
@saldo decimal(10,2) output
AS BEGIN
SELECT @saldo = SALDO FROM CUENTAS
WHERE NUMCUENTA = @numCuenta
END
Funciones
SQL Server proporciona al usuario la posibilidad de definir sus propias funciones, conocidas como UDF
(userdefinedfunctions). Exisiten tres tipos de funciones:
Funciones escalares:
Las funciones escalares devuelven un nico valor de cualquier tipo de los datos tales como int, money, varchar, real, etc.
--Lista de parmetros
(@param1 tipo, @param2 tipo)
AS
BEGIN
...
END
Ejemplo:
CREATE FUNCTION fn_MultiplicaSaldo
(@NumCuentaVARCHAR(20), @Multiplicador DECIMAL(10,2))
RETURNS DECIMAL(10,2)
AS
BEGIN
DECLARE @Saldo DECIMAL(10,2),
@ReturnDECIMAL(10,2)
SELECT @Saldo = SALDO
FROM CUENTAS
WHERE NUMCUENTA = @NumCuenta
SET @Return= @Saldo * @Multiplicador
RETURN @Return
END
Las funciones escalares pueden ser ejecutadas dentro de consultas (en el SELECT). La funcin ejecutar una vez por cada fila
del conjunto de resultados devuelto por la consulta SELECT principal. ????
Ejemplo:
SELECT IDCUENTA, NUMCUENTA, SALDO, FCHALTA,
dbo.fn_MultiplicaSaldo (NUMCUENTA, IDCUENTA) AS RESULTADO --Ejecucin de la funcin:
FROM CUENTAS
Las funciones escalares son muy similares a los procedimientos almacenados con parmetros de salida, pero estas pueden
ser utilizadas en consultas de seleccin y en la clusula where de las mismas.
Las funciones no pueden ejecutar sentencias INSERT o UPDATE. El siguiente ejemplo muestra cmo utilizar una funcin
escalar en un script TransactSQL.
Ejemplo:
DECLARE @NumCuentaVARCHAR(20), @Resultado DECIMAL(10,2)
SET @NumCuenta= '200700000001'
SET @Resultado = dbo.fn_MultiplicaSaldo(@NumCuenta, 30.5)
PRINT @Resultado
Funciones en lnea:
Triggers (Disparadores)
Un trigger es una clase especial de procedimiento almacenado que se ejecuta automticamente cuando se produce un
evento en el servidor de bases de datos. Se utiliza para garantizar que cuando se realiza determinada operacin sobre una
tabla, siempre se ejecute una accin relacionada con esa operacin.
Para qu utilizarlos?
Evitar la ejecucin de transacciones invlidas.
Garantizar el cumplimiento de restricciones de integridad.
Garantizar el cumplimiento de reglas del negocio.
Generar, automticamente, valores de columnas derivadas.
Utilidad
Para duplicar los contenidos de una tabla automticamente y en tiempo real.
Para controlar las modificaciones de los valores de los campos de una tabla (auditoras).
Para realizar actualizaciones de una tabla en cascada.
Para modificar campos o registros de una tabla que un usuario no puede modificar directamente.
Consideraciones
El disparador no debe ser utilizado para garantizar el cumplimiento de restricciones de integridad que puedan ser
definidas a nivel de esquema.
Hay que evitar crear disparadores recursivos.
Trigger DDL:
Se ejecutan en respuesta a una variedad de eventos de lenguaje de definicin de datos (DDL). Estos eventos corresponden
principalmente a instrucciones CREATE, ALTER y DROP de Transact-SQL, y a determinados procedimientos almacenados del
sistema que ejecutan operaciones de tipo DDL.
Trigger DML:
Se ejecutan cuando un usuario intenta modificar datos mediante un evento de lenguaje de manipulacin de datos (DML). Es
decir, en instrucciones INSERT, UPDATE o DELETE de una tabla o vista.
Los triggers pueden actuar antes o en lugar de que se realice la operacin que lo invoca. Se pueden definir triggers
diferentes para cada tipo de evento (INSERT, UPDATE,DELETE) pero lo ms lgico es crear un nico trigger para todos los
eventos asociados a una tabla y utilizar una sentencia IF para distinguir qu accin realizar dependiendo del evento.
Sintaxis:
AFTER
Especifica que el desencadenador DML solo se activa cuando todas las operaciones especificadas en la instruccin SQL
desencadenadora se han ejecutado correctamente. Adems, todas las acciones referenciales en cascada y las
comprobaciones de restricciones deben ser correctas para que este desencadenador se ejecute.
AFTER es el valor predeterminado cuando solo se especifica la palabra clave FOR.
Los desencadenadores AFTER no se pueden definir en las vistas.
INSTEAD OF
Especifica que se ejecuta el desencadenador DML en vez de la instruccin SQL desencadenadora, por lo que se suplantan las
acciones de las instrucciones desencadenadoras.
Como mximo, se puede definir un desencadenador INSTEAD OF por cada instruccin INSERT, UPDATE o DELETE en cada
tabla o vista.
No se puede crear ms de un trigger del tipo INSTEAD OF para la misma tabla.
Inserted y Deleted
Las instrucciones de triggers DML utilizan dos tablas especiales denominadas inserted y deleted, con la misma estructura
que tiene la tabla que ha desencadenado la ejecucin del trigger. SQL Server crea y administra automticamente ambas
tablas. Son tablas temporales residentes en memoria.
No se pueden modificar directamente los datos de estas tablas. El trigger se ejecutar aunque la instruccion DML (UPDATE,
INSERT o DELETE) no haya afectado a ninguna fila. En este caso inserted y deleted devolvern un conjunto de datos vaco.
Inserted
Solo est disponible en las operaciones INSERT y UPDATE y contiene los datos con los que se dispar el trigger. Inserted
estar vaca en una operacin DELETE.
Deleted
Est disponible en las operaciones UPDATE y DELETE. Se encuentran los valores anteriores a la ejecucin de la actualizacin
o borrado. Es decir, los datos que sern borrados. Deleted estar vaca en una operacin INSERT.
En los casos de Update ambas tablas se llenarn. Pueden contener ms de un registro.
Ejemplo:
Estudiantes (estudianteCod, nombre, ciudadNac, fchNac)
Cursos (cursoCod, nombre)
Inscripciones (estudianteCod, cursoCod, costo, fchInsc)
**Cargar en la tabla IngresosEstudiantes (IngEstCodigo, idEstudiante, nomEstudiante, fchIngSistema) cada vez que se
ingresa un estudiante al sistema.
CREATE TRIGGER IngresoEstudiante ON Estudiantes
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO IngresosEstudiantes(idEstudiante, nomEstudiante, fchINGSistema)
SELECT estudianteCod, nombre, GETDATE() FROM INSERTED;
END;
La implementacin anterior no tiene en cuenta actualizaciones de ms de un registro de manera simultnea. El select que
carga las variables de la tabla INSERTED est obteniendo los datos del ltimo registro de la tabla, pasando por alto el
procesamiento del resto de los registros que fueron actualizados.
Diccionario de datos
Se puede obtener informacin acerca de los triggers en las tablas.
Tambin podemos ver los triggers de una tabla en la opcin Ver Dependencias sobre la tabla en el Management Studio.
En la carpeta triggers de la tabla, veremos todos lo disparadores de la tabla.
SELECT po.name as Tabla, tr.name as [Trigger Name]
FROM sysobjects po
JOIN sysobjects tr ON tr.parent_obj = po.id
WHERE tr.xtype = 'TR'
AND po.name = '<nombre_tabla>'
AND po.xtype = 'U'
Activar un trigger
ENABLE TRIGGER <nombre_trigger> ON <nombre_tabla>
Borrar un trigger
DROP TRIGGER <nombre_trigger>
Privilegios o permisos
Un privilegio es la capacidad de un usuario dentro de la base de datos a realizar determinadas operaciones o acceder a
determinados objetos de otros usuarios. El creador de un objeto obtiene todos los privilegios sobre el objeto, incluyendo el
privilegio de conceder privilegios a otros.
Clusula GRANT
La clusula GRANT se utiliza para conceder privilegios en SQL.
GRANT listaPrivilegios ON nombreObjeto TO listaUsuarios/roles
WITH GRANT OPTION
Algunos ejemplos:
1- Conceder permisos de consulta al usuario Apg01 sobre la tabla inscripciones.
GRANT SELECT ON inscripciones TO Apg01;
2- Dar autorizacin de insercin y de actualizacin para los usuarios Apg01 y Apg02 sobre la tabla estudiantes.
GRANT INSERT, UPDATE ON estudiantes TO Apg01, Apg02;
3- Dar permiso de actualizacin sobre la columna ciudadNac de la tabla estudiantes al usuario Apg04.
GRANT UPDATE(ciudadNac) ON estudiantes TO Apg04;
Este comportamiento por defecto se puede modificar con la clusula WITH GRANT OPTION, que permite que el usuario
que recibe un permiso pueda dar el mismo permiso a otros usuarios.
Ej: conceder privilegios de consulta sobre la tabla inscripciones al usuario Agp06 y permitir que ste pueda otorgar permisos
de consulta sobre dicha tabla a otros usuarios.
Revoke
Para quitar permisos:
REVOKE listaPrivilegios ON nombreObjeto TO listaUsuarios/roles
En store procedure
EXEC sp_addlogin '<nombre_usuario>', '<nombre_login>';
Creacin de usuarios
Agrega un usuario a la base de datos actual. Hay once tipos de usuarios. En el curso trabajaremos con el tipo de usuario
basado en un inicio de sesin mediante autenticacin de SQL Server create user for login (with default_database=[]).
Creacin de roles
Normalmente las autorizaciones no se conceden a usuarios individuales sino que se asocian a roles. Los usuarios se asocian
a roles (ninguno, uno o varios) y reciben las autorizaciones que tengan esos roles.