Está en la página 1de 28

Que es una bd?

Conjunto de datos relacionados entre s.


Representan la realidad o parte de ella.
Tienen un significado.

Sistema de base de datos

Lenguaje de definicin de datos (LDD o DDL):


Permite definir los objetos y las relaciones, es decir las estructuras de los datos para almacenar la informacin.

El resultado de la compilacin de las instrucciones en DDL es un conjunto de tablas denominadas Diccionario de Datos o
Directorio de Datos.

Adems de la especificacin de los objetos permite definir:

Dominio asociado a cada atributo.


Restricciones de integridad.
ndices.
Permisos para acceder a los objetos.

Lenguaje de modificacin de datos (LMD o DML):


Permite manejar o tener acceso a los datos que estn organizados por medio de modelos apropiados.

Esta manipulacin consiste en:

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

Create DATABASE nombreBD;

Crea una nueva Base de Datos en donde generaremos toda la estructura.

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:

CREATE TABLE Productos ( prodCod INTEGER,


nombre VARCHAR(50),
peso DECIMAL(9,2),
descripcion VARCHAR(200));

Restricciones de integridad de datos.


Implementar o imponer reglas en los datos de una tabla cuando una fila es insertada, modificada o borrada de la tabla.
Tambien llamadas constraint, se debe cumplir para que la operacin se realice. Previene la eliminacin de una tabla si
existen dependencias con otras.

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

CREATE TABLE Ventas (ventaCod INTEGER PRIMARY KEY,


prodCod INTEGER REFERENCES Productos,
precio DECIMAL(9,2) NOT NULL,
fecha DATETIME NOT NULL);

Declaracin al final de la tabla:


CREATE TABLE Productos (prodCod INTEGER,
nombre VARCHAR(50),
peso DECIMAL(9,2),
descripcion VARCHAR(200) NOT NULL,
PRIMARY KEY(prodCod) , //Si tengo ms de un att, se declara as.
CHECK(prodCod between 0 and 100),
UNIQUE(nombre)); // Si tengo ms de un att, se declara as.

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

Para reiniciar el valor:


DBCC CHECKIDENT (<nombre_tabla>, RESEED,0);
El 0 corresponde al ltimo valor de identidad agregado y desde el que se desea seguir, ejemplo, si se quiere iniciar desde el
80, en lugar del cero vamos a poner 79 como el ltimo valor correcto.

ALTER (modificacin):
Permite modificar la definicin de una tabla existente como agregar o eliminar columnas y constraint. Cambiar ancho del
dato, etc.

Se deben tener en cuenta las siguientes reglas:


No es posible disminuir el tamao de una columna.
En las modificaciones, los tipos anterior y nuevo deben ser compatibles, o la tabla debe estar vaca.
La opcin ADD ... NOT NULL slo ser posible si la tabla est vaca.
La opcin MODIFY ... NOT NULL slo podr realizarse cuando la tabla no contenga ninguna fila con valor nulo en la
columna en cuestin.
Ejemplo de sentencias ADD:
ALTER TABLE Productos add fecha DateTime NOT NULL;

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.

Para agregar restricciones:


ALTER TABLE Departamentos ADD CONSTRAINT Dep_Id_Pk PRIMARY KEY (Dep_Id);

ALTER TABLE Empleados ADD CONSTRAINT Emp_Fk_Dep FOREIGN KEY (Dep_Id)


REFERENCES Departamentos (Dep_Id);

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

Cambiar el tamao de una columna en una tabla:


ALTER TABLE T_PEDIDOS MODIFY TEXTOPEDIDO Varchar2(135);

Hacer NOT NULL una columna en una tabla:


ALTER TABLE T_PEDIDOS MODIFY (TEXTOPEDIDO NOT NULL);

Eliminar una columna a una tabla:


ALTER TABLE T_PEDIDOS DROP COLUMN TEXTOPEDIDO;

Valor por defecto de una columna:


ALTER TABLE T_PEDIDOS MODIFY TEXTOPEDIDO Varchar2(135) DEFAULT 'ABC...';

Aade dos columnas:


ALTER TABLE T_PEDIDOS ADD (SO_PEDIDOS_ID INT, TEXTOPEDIDO Varchar2(135));
DROP Eliminar:
Permite eliminar objetos de la bd, desde tablas hasta restricciones, se usa tambin en combinacin con Alter, para eliminar
columnas y constraint:
DROP tipoObjeto nombreobjeto
ALTER TABLE tabla DROP COLUMN columna; //Borrar una columna.
ALTER TABLE Tabla DROP PRIMARY KEY | UNIQUE (Columnas) |CONSTRAINT <nombreConstraint>;

Los tipos de objetos pueden ser:


Table Index Function View
Sequence Procedure Trigger

Por ejemplo:
Drop table Empleados; //Borra toda la tabla, siempre que no hayan claves forneas en otras tablas que apunten a
columnas de sta.

Drop INDEX i_Empleado_Nombre;

ALTER TABLE Empleados DROP CONSTRAINT Emp_Fk_Dep; //Borra la constraint con ese nombre.

ALTER TABLE Empleados DROP CONSTRAINT Emp_Salario_Min;

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:

CREATE INDEX nombreIndice ON nombreTabla (columna1 , columna2)

Ejemplo:

CREATE INDEX i_nombre_productos ON Productos (nombre)

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.

Insert: Insercin de datos.


Permite asignar valores en filas a las columnas de una tabla.

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:

INSERT INTO nombreTabla VALUES (valor1, valor dos);

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:

INSERT INTO nombreTabla (nomColumna1, nomcolumna2) VALUES (valor1, valor2);


Update: Actualizacin/modificacin de datos.
Actualiza los campos correspondientes junto con los valores que se le asignen, en el subconjunto de filas que cumplan la
condicin de seleccin.

Sintaxis:

UPDATE nombreTabla SET columna1 = valor1, columna2 = valor2 WHERE condicin

Ejemplos:
Actualizar todas las filas de una columna:
UPDATE Inscripciones SET costo = 5000

Actualizar la ciudad para un estudiante de la tabla (con condicin):


UPDATE Estudiantes SET ciudadNac = 'Montevideo'
WHERE nombre = 'Fernando Martnez';

Dejar en nulo un valor:


UPDATE Estudiantes SET ciudadNac = NULL
WHERE nombre = 'Fernando Martnez';
Actualizar ms de un valor de la misma fila:
UPDATE tablaPedido SET nombre='JUAN',estado=1
WHERE codPedido=125;

Delete: Eliminacin de datos.


Borra una o ms filas de una tabla, dependiendo de la condicin WHERE.

Sintaxis:

DELETE FROM nombreTabla WHERE condicin; //Sin la condicin, borra todas las filas

Ejemplos:
DELETE FROM Estudiantes WHERE estudianteCod = 1;

Eliminar todos los registros de una tabla:


DELETE FROM Inscripciones;

Select: Recuperacin de datos.


El select corresponde a la proyeccin de algebra. Es usado para listar los atributos que queremos como resultado de la
consulta.
La seleccin sobre una tabla consiste en elegir un subconjunto de filas que cumplan (o no) algunas condiciones
determinadas. El resultado de una consulta SQL es una nueva tabla (relacin).

Se pueden incluir en un select:


Columna.
Una o varias columnas
Una o varias tablas: Tabla.* (para cuando trabajamos con ms de una tabla).
Una o varias columnas de distintas tablas: Tabla.columna (necesario cuando trabajamos con ms de una tabla y con
presencia de atributos de igual nombre).
Expresiones
Columna.
Resultados de Operacin aritmtica (/,*,+,-).
Constantes.

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;

Seleccionar todas las columnas de la tabla con *:


SELECT * FROM ESTUDIANTES WHERE ciudadNac = 'Montevideo';

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;

Consultas convinadas: Join


Habitualmente cuando necesitamos recuperar la informacin de una base de datos nos encontramos con que dicha
informacin se encuentra repartida en varias tablas, referenciadas a travs de varios cdigos.

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

Unin interna (unin)


INNER JOIN: es el caso de unin interna clsico, combina dos o ms tablas descartando todas las filas resultados
que no se correspondan en ambas. La clusula INNER JOIN permite separar completamente las condiciones de
combinacin con otros criterios.
Sintaxis:
SELECT DISTINCT nombreCampo1, nombreCampo2,
FROM nombreTabla
INNER JOIN nombreTabla ON condicionCombinacion
WHERE condicion AND|OR condicion
ORDER BY nombreCampo ASC|DESC , nombreCampo2 ASC|DESC;

Ejemplo:
INNER JOIN implcita:
SELECT Campos
FROM empleado, departamento
WHERE empleado.IDDepartamento = departamento.IDDepartamento

INNER JOIN explcita:


SELECT Campos
FROM empleado
INNER 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

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.

Empleado.Apellido IDDepartamento Departamento.NombreDepartamento

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

Unin externa (exclusin)

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:

SELECT DISTINCT nombreCampo1, nombreCampo2,


FROM nombreTabla1, LEFT|RIGHT OUTER JOIN nombreTabla2
WHERE condicion AND|OR condicion
ORDER BY nombreCampo ASC|DESC , nombreCampo2 ASC|DESC;

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;

Con tablas de ejemplo:


SELECT *
FROM empleado
LEFT OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento;

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

Gaspar 36 NULL NULL


Steinberg 33 Ingeniera 33

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;

Con tablas de ejemplo:


SELECT *
FROM empleado
RIGHT 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

NULL NULL Mercadeo 35

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

Gaspar 36 NULL NULL

Steinberg 33 Ingeniera 33

Andrade 31 Ventas 31

NULL NULL Mercadeo 35

Alias de tablas y atributos


Sirven para hacer el nombre de una columna ms significativo cuando se muestra, abreviar un nombre de una tabla o de
una columna que se usa a menudo, hacer ms clara una instruccin complicada de SQL o distinguir entre dos ocurrencias
del mismo nombre de columna o tabla en cualquier instruccin SELECT.

Se utilizan:

En el SELECT para columnas: SELECT expresion as Alias


En el FROM para tablas: FROM tabla as Alias

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:

SELECT ESTUDIANTES.nombre AS Nombre Estudiante, CURSOS.nombre AS Nombre Curso

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;

Obtener la cantidad de cursos que tienen inscripcin.


SELECT COUNT(DISTINCT idCurso) FROM INSCRIPCIONES;
AVG: Media aritmtica (promedio) de un atributo o una expresin numrica. Puede utilizar la clusula Distinct.

Ejemplo:
Obtener el precio medio de los costos de inscripciones
SELECT AVG(COSTO) FROM INSCRIPCIONES;

SUM(*): Suma de atributos o expresiones numricas. Puede utilizar la clusula Distinct.

Ejemplo:
Obtener el precio medio de los costos de inscripciones
SELECT AVG(COSTO) FROM INSCRIPCIONES;

MAX: Valor mximo de un atributo o expresin numrica.

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;

MIN: Valor mnimo de un atributo o expresin numrica.

Ejemplo:
Obtener la fecha del mayor de los estudiantes.
SELECT MIN(fchNac) FROM ESTUDIANTES;

Algunas reglas:

Devuelven un valor nico, numrico.


Solo pueden utilizarse en la clusula Select o en la clusula Having. No se pueden combinar con columnas que
devuelvan ms de un valor, a menos que la consulta contenga una clusula GROUP BY.
COUNT, MIN y MAX se pueden aplicar a atributos numricos o no numricos, pero SUM y AVG solo se pueden
aplicar a numricos.
Salvo la funcin COUNT(*), las dems solo tienen en cuenta para su clculo valores no nulos.

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:

No puede contener la clusula ORDER BY.


No puede ser la UNION de varias sentencias SELECT.
Si la subconsulta aparece en la lista de seleccin, o est asociada a un operador igual "=" solo puede devolver un
nico registro.

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:

SELECT columna1, columna2,... columna_n, funcion_agregacion(expresion)


FROM <tablas>
WHERE <condiciones>
GROUP BY columna1, columna2,columna_n;

Ejemplo:

SELECT estudianteCod, count(*)


FROM INSCRIPCIONES
GROUP BY estudianteCod

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;

Dar el nmero de estudiante, el nombre y sus totales de costo de inscripciones.


SELECT E.estudianteCod, E.nombre, sum(costo)
FROM INSCRIPCIONES I, ESTUDIANTES E
WHERE I.estudianteCod = E.estudianteCod
GROUP BY E.estudianteCod, E.nombre

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.

Having: Condiciones sobre grupos.


Con la clusula HAVING se pueden especificar condiciones sobre los grupos.

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.

CREATE VIEW nombreVista AS (sentencia_select);

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:

ALTER VIEW inscripciones2 AS (SELECT estudianteCod, cursoCod //Se quit un att.


FROM INSCRIPCIONES);

Se puede borrar una vista del esquema, para ello se utiliza la siguiente sintaxis:

DROP VIEW nombreVista;

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

CREATE VIEW nombreVista (aliasCol1, aliasCol2, . . . , aliasColN) AS (select);

Por qu usar Vistas:


Seguridad: nos puede interesar que los usuarios tengan acceso a una parte de la informacin que hay en una tabla,
pero no a toda la tabla.
Comodidad: el modelo relacional no es el ms cmodo para visualizar los datos, lo que nos puede llevar a tener que
escribir complejas sentencias SQL. Tener una vista nos simplifica esta tarea.

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.

Con T-SQL vamos a poder programar:


Procedimientos almacenados Funciones Triggers Scripts

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.

En TransactSQL podemos asignar valores a una variable de varias formas:

A travs de la instruccin set.


Utilizando una sentencia SELECT.
Realizando un FETCH de un cursor.
La consulta debe devolver un nico registro.

Ejemplo:
declare @nombre varchar(50)--declare declara una variable
--@nombre es el identificador de la
--variable de tipo varchar

set @nombre = 'google.com' --Aqu asignamos un valor a la variable.

Print @Nombre --Imprime por pantalla el valor de @nombre.

--Asignar valor a la variable con set a travs de una consulta:


SET @nombre = (SELECT nombre FROM ESTUDIANTES WHERE CodEst= 1)

--Asignar valor a la variable utilizando select:


DECLARE @nombre VARCHAR(100),@apellido1 VARCHAR(100),@apellido2 VARCHAR(100)
SELECT @nombre= nombre, @apellido1=Apellido1, @apellido2=Apellido2
FROM CLIENTES
WHERE ID = 1
PRINT @nombre
PRINT @apellido1
PRINT @apellido2

/*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.

Sintaxis: Ejemplo: DECLARE @coPais int, @descripcion varchar(255)


IF (<expresion>) set @coPais = 5
BEGIN DECLARE @ciudad varchar(3) set @descripcion= 'Uruguay
... SET @ciudad = 'MVD'
END IF @ciudad = 'MVD' IF EXISTS (SELECT * FROM PAISES WHERE CO_PAIS = @coPais)
ELSE IF (<expresion>) BEGIN BEGIN
BEGIN PRINT 'Montevideo' UPDATE PAISES SET DESCRIPCION = @descripcion
... END WHERE CO_PAIS = @coPais
END ELSE END
ELSE BEGIN ELSE
BEGIN PRINT 'Otra ciudad' BEGIN
... END INSERT INTO PAISES(CO_PAIS, DESCRIPCION)
END END VALUES(@coPais, @descripcion)
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.

Para crear un procedimiento almacenado debemos emplear la sentencia CREATE PROCEDURE:


CREATE PROCEDURE NombreProcedure
@param1 tipo,
@param2 tipo
AS
--Sentencias del procedure
Para modificar un procedimiento almacenado debemos emplear la sentencia ALTER PROCEDURE:
ALTER PROCEDURE NombreProcedure
@param1 tipo,
@param2 tipo
AS
--Sentencias del procedure
CREATE PROCEDURE spu_addCliente
@nombre varchar(100),
@apellido1 varchar(100),
@apellido2 varchar(100),
@rutvarchar(20),
@fchNacimientodatetime
AS
INSERT INTO CLIENTES (nombre, apellido1, apellido2, rut, fchnacimiento)
VALUES (@nombre, @apellido1, @apellido2, @rut, @fchNacimiento)

Para ejecutar un procedimiento almacenado debemos utilizar la sentencia EXEC:


DECLARE @fecha_nacimiento datetime
set @fecha_nacimiento= convert(datetime, '13/05/1975', 103)

EXEC spu_addCliente'Pedro', 'Herrarte', 'Sanchez', '00000002323', @fecha_nacimiento

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

DECLARE @saldo decimal(10,2)


EXEC spu_ObtenerSaldoCuenta '200700000001', @saldo output
PRINT @saldo

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.

CREATE FUNCTION nombreFuncionEscalar

--Lista de parmetros
(@param1 tipo, @param2 tipo)

--Tipo de datos que devuelve la funcin.


RETURNS tipoDato

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:

Funciones en lnea de mltiples sentencias:

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.

Tipos de Trigger DDL y DML


SQL Server proporciona los siguientes tipos de triggers.

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:

CREATE TRIGGER nombreTrigger ON nombreTablaOVista

FOR AFTER|INSTEAD OF Insert|Update|Delete

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.

INSERT, UPDATE, DELETE


Especifica las instrucciones de modificacin de datos que activan el desencadenador DML cuando se intenta en esta tabla o
vista. Se debe especificar al menos una opcin.
En la definicin del desencadenador se permite cualquier combinacin de estas opciones, en cualquier orden. Para los
desencadenadores INSTEAD OF, no se permite la opcin DELETE en tablas que tengan una relacin de integridad referencial
que especifica una accin ON DELETE en cascada.
No se permite la opcin UPDATE en tablas que tengan una relacin de integridad referencial que especifica una accin ON
UPDATE en cascada.

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;

**Cargar en la tabla EstudiantesEliminados(IngEstCodigo, idEstudiante, nomEstudiante, fchElimSistema) cada vez que se


elimina un estudiante del sistema.
CREATE TRIGGER EstudianteEliminado
ON Estudiantes
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO EstudiantesEliminados(idEstudiante, nomEstudiante, fchINGSistema)
SELECT estudianteCod, nombre, GETDATE()
FROM DELETED;
END;

**Lo mismo en un solo trigger:


CREATE TRIGGER EstudianteInsertadoEliminado ON Estudiantes
AFTER INSERT, DELETE
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS(SELECT * FROM INSERTED) // nos permite saber si estamos insertando o eliminando
BEGIN
INSERT INTO IngresosEstudiantes(idEstudiante, nomEstudiante, fchINGSistema)
SELECT estudianteCod, nombre, GETDATE() FROM INSERTED;
END
ELSE IF EXISTS(SELECT * FROM DELETED) // nos permite saber si estamos insertando o eliminando
BEGIN
INSERT INTO EstudiantesEliminados(idEstudiante, nomEstudiante, fchINGSistema)
SELECT estudianteCod, nombre, GETDATE() FROM DELETED;
END;
END;
Actualizaciones con ms de un registro
En el siguiente ejemplo, si insertamos o actualizamos el registro de una inscripcin de manera que su costo sea superior a
5000, el trigger actualizar dicho costo al valor de 5000 independientemente del costo que nosotros hayamos insertado o
introducido al modificar el registro.

CREATE TRIGGER trigger_inscripciones1 ON inscripciones


INSTEAD OF INSERT, UPDATE
AS
DECLARE
@estudianteCod int,
@cursoCod int,
@fchIns date,
@costo numeric(9,2)
BEGIN
SET NOCOUNT ON;
SELECT @estudianteCod = estudianteCod, @cursoCod = cursoCod, @fchIns = fchInsc, @costo = costo FROM inserted;
If 5000 < @costo
BEGIN
SET @costo = 5000;
END
If EXISTS (SELECT * FROM deleted)
BEGIN
UPDATE inscripciones SET costo = @costo, cursoCod = @cursoCod, fchINsc = @fchIns
WHERE estudianteCod =@estudianteCod;
END
Else
BEGIN
INSERT inscripciones SELECT estudianteCod, cursoCod, @costo, fchINsc FROM inserted;
END
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.

CREATE TRIGGER trigger_inscripciones1 ON inscripciones


INSTEAD OF INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
If EXISTS (SELECT * FROM deleted)
BEGIN
UPDATE inscripciones SET costo = I.costo, cursoCod = I.cursoCod, fchINsc = I.fchInsc
FROM Inscripciones Ins, Inserted I
WHERE I.estudianteCod = Ins.estudianteCod and I.cursoCod = Ins.cursoCod and I.costo <=5000 ;
UPDATE inscripciones SET costo = 5000, cursoCod = I.cursoCod, fchINsc = I.fchInsc
FROM Inscripciones Ins, Inserted I
WHERE I.estudianteCod = Ins.estudianteCod and I.cursoCod = Ins.cursoCod and 5000 < I.costo ;
END
Else If EXISTS (SELECT * FROM inserted)
BEGIN
INSERT inscripciones SELECT estudianteCod, cursoCod, 5000, fchINsc FROM inserted WHERE 5000 < costo;
INSERT inscripciones SELECT estudianteCod, cursoCod, costo, fchINsc FROM inserted WHERE costo <=5000 ;
END
END

Especificar columna en Update


Podemos especificar a que columnas de la tabla debe afectar el trigger.
ALTER TRIGGER TR_CUENTAS
ON CUENTAS
AFTER UPDATE
AS
BEGIN

END

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 Desactivar Triggers


Desactivar un trigger
DISABLE TRIGGER <nombre_trigger> ON <nombre_tabla>

Activar un trigger
ENABLE TRIGGER <nombre_trigger> ON <nombre_tabla>

Desactivar todos los triggers de una tabla


ALTER TABLE <nombre_tabla> DISABLE TRIGGER ALL;

Activar todos los triggers de una tabla


ALTER TABLE <nombre_tabla> ENABLE TRIGGER ALL;

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

listaPrivilegios puede ser:


SELECT UPDATE DELETE INSERT EXECUTE

Los nombres de objetos pueden ser nombres de:


Tablas Vistas Procedimientos Funciones

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;

4-Autorizar al usuario Apg05 a insertar y eliminar tuplas de la tabla inscripciones.


GRANT INSERT, DELETE ON inscripciones TO Apg05;

With grant option


Por defecto, un usuario o rol que recibe un privilegio no est autorizado a concedrselo a otros usuarios y/o roles.

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

Loguin, usurios y roles


Creacin loguin
Crea un nuevo inicio de sesin de SQL Server que permite a un usuario conectar a una instancia de SQL Server con la
autenticacin de SQL Server. Tambin puede utilizarse el SP sp_addlogin, pero Microsoft advierte que esta opcin dejar
de soportarse en futuras versiones.
Create login <nombre_login> with password='<password>';

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.

Crear un rol de base de datos nuevo en la base de datos actual:

CREATE ROLE nombreRol

Asignar rol a usuario


Mediante el siguiente SP se aigna un rol a un usuario. Esta caracterstica se quitar en una versin futura de Microsoft SQL
Server. A partir de SQL Server 2012 se recomienda utilizar ALTER ROLE en lugar de este SP.

EXEC sp_addrolemember nombreROl, nombreUsuario

Diagrama de concepcin deprivilegios


Se utilizan para representar grficamente las concesiones de permisos. Nodos: representan un Usuario y Privilegio
Arcos: representan Concesiones de Privilegios

También podría gustarte