Académique Documents
Professionnel Documents
Culture Documents
Al terminar el Curso
Al final del curso, el estudiante tendrá las habilidades para describir los elementos
de SQL Server 2000; describir los conceptos básicos de la programación con
Transact-SQL; crear y manipular bases de datos y sus componentes relacionados;
implementar los cuatro tipos de integridad (integridad de entidad, integridad de
dominio, integridad referencial e integridad definida por el usuario); plan para el
uso de índices; crear y mantener índices; crear y mantener vistas de datos;
implementar funciones definidas por el usuario; diseñar, crear y usar
procedimientos almacenados; crear e implementar triggers; programar a través de
múltiples servidores usando consultas distribuidas, transacciones distribuidas, y
vistas particionadas; optimización de consultas; manejo de transacciones y
candados para asegurar la concurrencia.
1
SQL Server 2000
Base de Datos
Es un conjunto de información que tiene un significado y que se encuentra
organizada en entidades de manera que se minimice la redundancia, mantenga la
integridad y seguridad de la información. Algunas de estas funciones se logran a
través de un buen diseño de base de datos y otras con el apoyo de un manejador
de base de datos (como lo es SQL Server 2000).
Hay varias formas de organizar los datos en las bases de datos, pero las bases de
datos relacionales son una de las formas más efectivas. Los sistemas de bases de
datos relacionales son una aplicación de la teoría matemática de los conjuntos al
problema de la organización de datos. En una base de datos relacional, los datos
están organizados en tablas.
La Arquitectura Cliente/Servidor
• SQL utiliza la arquitectura Cliente/Servidor para separar las cargas de
trabajo de tareas que se ejecutan en un servidor de aquellas que se
ejecutan en el lado del cliente.
• El Servidor es el responsable de la manipulación de la información y el
Cliente de la presentación de datos al usuario. El cliente típicamente corre
sobre una o más computadoras clientes, pero también puede correr sobre
la computadora que hace las veces de servidor (donde se encuentra SQL
Server).
SQL Server maneja las bases de datos y controla los recursos disponibles en
el Servidor, tales como memoria, ancho de banda y operaciones de disco entre
múltiples solicitudes.
2
SQL Server 2000
3
SQL Server 2000
• Escalabilidad y disponibilidad.
El mismo motor de base de datos se puede utilizar en un intervalo de
plataformas desde equipos portátiles que ejecutan Microsoft Windows 98 o
por medio de grandes servidores con varios procesadores que ejecutan
Microsoft Windows 2000. SQL Server 2000 Enterprise admite
características como servidores federados, vistas indexadas y soporte
para memorias grandes, que le permiten ampliarse a los niveles de
rendimiento requeridos por los mayores sitios Web.
Un grupo de servidores autónomos que cooperan para compartir el trabajo
se denomina federación.
Para obtener servidores de bases de datos federados, se crean bases de
datos en cada servidor y después se dividen las tablas entre estas bases de
datos.
• Almacenamiento de datos.
SQL Server 2000 incluye herramientas para extraer y analizar datos de
resumen para el procesamiento analítico en línea. SQL Server incluye
también herramientas para diseñar gráficamente las bases de datos y
analizar los datos mediante preguntas en inglés.
4
SQL Server 2000
El servicio SQL Server administra todos los archivos que componen las bases de
datos que pertenecen a una instancia de SQL Server. Es el componente que
procesa todas las instrucciones Transact-SQL enviadas desde las aplicaciones
cliente de SQL Server. SQL Server admite también consultas distribuidas que
recuperan datos de varios orígenes, no sólo SQL Server.
El servicio SQL Server asigna recursos del equipo de un modo eficaz entre varios
usuarios simultáneos. También implementa reglas de empresa definidas en
procedimientos almacenados y desencadenadores, asegura la coherencia de los
datos y evita problemas lógicos como el tener a dos personas intentando
actualizar los mismos datos a la vez.
• Trabajos
Objetos definidos que constan de uno o más pasos para llevarse a cabo.
Los pasos son las instrucciones Transact-SQL que se van a ejecutar. Por
ejemplo, se pueden programar trabajos para que se ejecuten a horas
específicas o a intervalos regulares.
• Alertas
Acciones que se realizan cuando se producen sucesos específicos, como
un error concreto o errores de cierta gravedad, o cuando se alcanza el
límite de espacio libre disponible definido en una base de datos. Se puede
definir que la alerta realice acciones como el envío de mensajes de correo
electrónico, mensajes de localización a un operador o la ejecución de un
trabajo que resuelva el problema.
5
SQL Server 2000
• Operadores
Personas identificadas mediante sus cuentas de red o sus identificadores
de correo electrónico, quienes pueden resolver los problemas del servidor.
Pueden ser destinos de las alertas, a través de correo electrónico, un
localizador o comandos de red.
• Buscar un valor de caracteres igual que, menor que o mayor que una
constante de caracteres.
El uso del servicio Microsoft Search permite a Microsoft SQL Server 2000 y SQL
Server 7.0 admitir búsquedas más sofisticadas en columnas de cadenas de
caracteres.
El servicio Microsoft Search tiene dos funciones:
• Indexación
Implementa los catálogos e índices de texto que se definen en la base de
datos. Acepta las definiciones de catálogos de texto, y las tablas y
columnas que comprenden los índices en cada catálogo. Implementa las
peticiones para llenar los índices de texto.
• Consultas
Procesa consultas de búsqueda de texto. Determina qué entradas del
índice cumplen los criterios de selección de texto. Por cada entrada que
cumpla los criterios de selección, devuelve la identidad de la fila más un
valor de clasificación al servicio de SQL Server, que utiliza esa información
para construir el conjunto de resultados de la consulta. Los tipos de
consultas compatibles incluyen búsquedas de:
• Palabras o frases.
• Palabras próximas entre sí.
6
SQL Server 2000
Servicio MS DTC
7
SQL Server 2000
8
SQL Server 2000
Los sistemas Microsoft SQL Server 2000 tienen cuatro bases de datos del
sistema:
• master
• tempdb
9
SQL Server 2000
• model
La base de datos model se utiliza como plantilla para todas las bases de
datos creadas en un sistema. Cuando se emite una instrucción CREATE
DATABASE, la primera parte de la base de datos se crea copiando el
contenido de la base de datos model, el resto de la nueva base de datos se
llena con páginas vacías. Como tempdb se crea de nuevo cada vez que se
inicia SQL Server, la base de datos model siempre tiene que existir en un
sistema SQL Server.
• msdb
En SQL Server 2000 y SQL Server 7.0, cada base de datos, incluidas las bases de
datos del sistema, tiene su propio conjunto de archivos y no los comparte con
otras bases de datos.
10
SQL Server 2000
API SQL-DMO
11
SQL Server 2000
Arquitectura de seguridad
El grupo local CORPUSERS contiene dos usuarios y un grupo global, Mktg, que
también contiene dos usuarios. SQL Server permite utilizar directamente los
grupos locales y globales de Windows NT 4.0 y Windows 2000 para organizar sus
cuentas de usuario. Además, los usuarios de Windows NT 4.0 Fred y Jerry, que
no pertenecen a un grupo de Windows NT 4.0, pueden agregarse a una instancia
de SQL Server directamente como usuarios de Windows NT 4.0 (por ejemplo,
Fred) o como usuarios de SQL Server (Jerry).
SQL Server amplía aún más este modelo con el uso de las funciones. Las
funciones son grupos de usuarios organizados con fines administrativos, como los
grupos de Windows NT 4.0 o Windows 2000, pero se crean en SQL Server
cuando no existe un grupo equivalente en Windows NT 4.0 o Windows 2000. Por
ejemplo, la función Managers contiene el grupo global Mktg de Windows NT 4.0 y
los usuarios de Windows NT Frank y Fred.
SQL Server ofrece también seguridad en las aplicaciones, mediante el uso de
funciones de aplicación de base de datos individuales.
12
SQL Server 2000
Utilizar identificadores
Esta tabla tiene también una restricción sin nombre. La restricción PRIMARY KEY
no tiene identificador.
identificadores normales
Siguen las reglas de formato de los identificadores. Los identificadores normales
no están delimitados cuando se usan en instrucciones de Transact-SQL.
SELECT *
FROM TableX
WHERE Llave = 124
13
SQL Server 2000
identificadores delimitados
Se incluyen entre comillas dobles (") o corchetes ([ ]). Los identificadores que
siguen las reglas de formato de los identificadores pueden estar delimitados o no.
SELECT *
FROM [TableX] --Delimiter is optional.
WHERE [KeyCol] = 124 --Delimiter is optional.
SELECT *
FROM [My Table] --El identificador un espacio y usa una palabra reservada.
WHERE [order] = 10 --El identificador es una palabra reservada.
14
SQL Server 2000
Esto se efectúa a través de las cuatro sentencias del lenguaje Transact SQL:
• La sentencia SELECT es usada para recuperar datos.
• La sentencia UPDATE es usada para modificar datos existentes.
• La sentencia INSERT es usada para agregar nuevos registros a las tablas.
• La sentencia DELETE es usada para remover registros que ya no necesite
de una tabla.
15
SQL Server 2000
Variables Locales
Variables Globales
@@FETCH_STATUS
Sintaxis
@@FETCH_STATUS
16
SQL Server 2000
Observaciones
Al ser @@FETCH_STATUS global para todos los cursores de una conexión, debe
usarse con cuidado. Después de ejecutar una instrucción FETCH, la
comprobación de @@FETCH_STATUS se debe realizar antes de que se ejecute
otra instrucción FETCH sobre otro cursor. El valor de @@FETCH_STATUS no
está definido antes de producirse las recuperaciones en la conexión.
@@ERROR
Devuelve el número de error de la última instrucción Transact-SQL ejecutada.
Sintaxis
@@ERROR
Observaciones
Cuando Microsoft® SQL Server completa con éxito la ejecución de una instrucción
Transact-SQL, en @@ERROR se establece el valor 0. Si se produce un error, se
devuelve un mensaje de error. @@ERROR devuelve el número del mensaje de
error, hasta que se ejecute otra instrucción Transact-SQL. Puede ver el texto
asociado a un número de error @@ERROR en la tabla de sistema sysmessages.
Al restablecerse @@ERROR con cada instrucción ejecutada, debe comprobarlo
inmediatamente después de la instrucción que desea validar o guardarlo en una
variable local para examinarlo posteriormente.
@@ROWCOUNT
Sintaxis
@@ROWCOUNT
Observaciones
En esta variable se establece 0 al ejecutarse una instrucción que no devuelva filas,
como por ejemplo la instrucción IF.
17
SQL Server 2000
@@TRANCOUNT
Sintaxis
@@TRANCOUNT
Observaciones
La instrucción BEGIN TRANSACTION incrementa @@TRANCOUNT en 1.
ROLLBACK TRANSACTION reduce @@TRANCOUNT a 0. Cada instrucción
COMMIT TRANSACTION o COMMIT WORK disminuye @@TRANCOUNT en
uno.
18
SQL Server 2000
Tipos de Datos
Numéricos exactos
Integers
Decimal y Numeric
Números de precisión y escala fijas. Cuando se utiliza la precisión
máxima, los valores permitidos están comprendidos entre - 10^38 +1
y 10^38 - 1.
Money y Smallmoney
money Valores de moneda comprendidos entre -263 (-
922.337.203.685.477,5808) y 263 - 1 (+922.337.203.685.477,5807),
con una precisión de una diezmilésima de la unidad monetaria.
19
SQL Server 2000
Datetime y Smalldatetime
Datetime Datos de fecha y hora comprendidos entre el 1 de enero de 1753 y el
31 de diciembre de 9999, con una precisión de 3,33 milisegundos.
Timestamp Un número único para toda la base de datos que se actualiza cada
vez que se actualiza una fila.
Cadenas de Caracteres
Char Datos de caracteres no Unicode de longitud fija con una longitud
máxima de 8.000 caracteres.
Cadenas binarias
Binary Datos binarios de longitud fija con una longitud máxima de 8.000
bytes.
20
SQL Server 2000
Operadores
Un operador es un símbolo que indica una acción que va a ser usada en una o
más expresiones.
Operadores de Comparación
Operador Significado
= Igual a
> Mayor que
< Menor que
>= Mayor igual que
<= Menor igual que
<> Diferente
!= No igual a
!> No es mas grande que
!< No es menor que
Operadores Lógicos
Operador Significado
AND Verdadero si ambas expresiones son verdaderas
OR Verdadera si alguna expresión es verdadera
NOT La negación de un valores boléanos
BETWEEN Verdadero si el operando se encuentra en el rango
LIKE Verdadero si el operando se equipara a un modelo
IN Verdadero si el operando es igual a uno de una lista
SOME Verdadero si alguno de un conjunto de comparaciones son
verdaderas
ANY Verdadero si cualquiera de un conjunto de comparaciones son
verdaderas
ALL Verdadero si todo el conjunto de comparaciones son verdaderas
Operadores Aritméticos
Operador Significado
+ Suma
- Resta
* Multiplicación
/ División
% Módulo. Devuelve el residuo entero de una división. Por ejemplo
12 % 5 = 2 porque el residuo de 12 dividido por 5 es 2.
21
SQL Server 2000
Operadores Unitarios
Operador Significado
-5 El valor numérico es negativo
+5 El valor numérico es positivo
Operador de Asignación
Transact - SQL tiene un operador de asignación, a través del signo iguala (=). En
este ejemplo, la variable @Contador se declara. Entonces, el operador de
asignación coloca en la variable @Contador el resultado de la expresión.
El operador de precedencia
Cuando una expresión compleja tiene múltiples operadores, la precedencia del
operador determina la secuencia en que se realiza la operación. El orden de
ejecución puede afectar de manera significativa el valor resultante.
Los operadores tienen los siguientes niveles de precedencia. Un operador de los
niveles más altos se evalúa antes que un operador de un nivel más bajo:
• + (positivo), - (negativo)
• =, >, <, >=, <=, <>, !=, !>, !< (operadores de comparación)
• NOT
• AND
• = (asignación)
22
SQL Server 2000
BEGIN...END
Encierra un conjunto de instrucciones Transact-SQL de forma que se pueda
ejecutar. BEGIN y END son palabras clave del lenguaje de control de flujo.
Sintaxis
BEGIN
{
sql_statement
| statement_block
}
END
Argumentos
{sql_statement | statement_block}
Es cualquier instrucción o grupo de instrucciones Transact-SQL válidos definidos
como bloque de instrucciones.
Observaciones
23
SQL Server 2000
BREAK
Hace que se salga del ciclo WHILE más interno. Se ejecutan las instrucciones que
aparecen después de la palabra clave END, que marca el final del ciclo.
CONTINUE
Reinicia un ciclo WHILE. Las instrucciones que se encuentren a continuación de la
palabra clave CONTINUE se omiten. CONTINUE se suele activar, aunque no
siempre, con una comprobación IF.
GOTO
Altera el flujo de ejecución y lo dirige a una etiqueta. Las instrucciones Transact-
SQL que siguen a una instrucción GOTO se pasan por alto y el procesamiento
continúa en el punto que marca la etiqueta. Las instrucciones GOTO y las
etiquetas se pueden utilizar en cualquier punto de un procedimiento, lote o bloque
de instrucciones. Las instrucciones GOTO se pueden anidar.
Sintaxis
Definición de la etiqueta:
label :
Alteración de la ejecución:
GOTO label
24
SQL Server 2000
Argumentos
label
Es el punto a continuación del cual comienza el procesamiento cuando una
instrucción GOTO especifica esa etiqueta. Las etiquetas se deben ajustar a las
normas de los identificadores. Las etiquetas se pueden utilizar como comentarios,
tanto si se usa GOTO como si no.
Observaciones
GOTO puede aparecer dentro de las instrucciones de control de flujo condicional,
en bloques de instrucciones o en procedimientos, pero no se puede dirigir a una
etiqueta externa al lote. La ramificación con GOTO se puede dirigir a una etiqueta
definida antes o después de la instrucción GOTO.
IF...ELSE
La instrucción IF se usa para probar una condición. El control de flujo resultante
depende de si se especifica o no la instrucción ELSE opcional:
25
SQL Server 2000
Nota: En este ejemplo se usa la instrucción print para mandar un mensaje de error
o de actualización, para Visual Basic estos print son errores, por lo que se sugiere
no mandar el mensaje de actualizando.
RETURN
Sale incondicionalmente de una consulta o procedimiento. RETURN es inmediata
y completa, y se puede utilizar en cualquier punto para salir de un procedimiento,
lote o bloque de instrucciones. Las instrucciones que siguen a RETURN no se
ejecutan.
Sintaxis
RETURN [ integer_expression ]
Argumentos
integer_expression
Es el valor entero que se devuelve. Los procedimientos almacenados pueden
devolver un valor entero al procedimiento que realiza la llamada o a una
aplicación.
Tipos devueltos
26
SQL Server 2000
Observaciones
Cuando se utiliza con un procedimiento almacenado, RETURN no puede devolver
un valor NULL. Si un procedimiento intenta devolver un valor NULL (por ejemplo,
al utilizar RETURN @status si @status es NULL), se genera un mensaje de
advertencia y se devuelve un valor de 0.
El valor del estado de retorno se puede incluir en las siguientes instrucciones de
Transact-SQL del lote o procedimiento que ejecutó el procedimiento actual, pero
se deben introducir de la forma siguiente:
WAITFOR
Especifica un tiempo, intervalo de tiempo o suceso que desencadena la ejecución
de un bloque de instrucciones, procedimiento almacenado o transacción.
Sintaxis
Argumentos
DELAY
Indica a Microsoft SQL Server que espere hasta que haya transcurrido el tiempo
especificado, hasta un máximo de 24 horas.
'time'
Es la cantidad de tiempo que se esperará. El argumento time se puede especificar
en uno de los formatos aceptados para el tipo de datos datetime o como una
variable local. No se pueden especificar fechas; por tanto, no se permite la parte
de fecha del valor datetime.
TIME
Indica a SQL Server que espere hasta la hora especificada.
Observaciones
Después de ejecutar la instrucción WAITFOR, no puede utilizar la conexión a SQL
Server hasta que llegue la hora o se produzca el suceso que ha especificado.
Para ver los procesos activos y en espera, utilice sp_who.
27
SQL Server 2000
Ejemplo
WHILE
Establece una condición para la ejecución repetida de una instrucción o bloque de
instrucciones de SQL. Las instrucciones se ejecutan repetidamente mientras la
condición especificada sea verdadera. Se puede controlar la ejecución de
instrucciones en el bucle WHILE con las palabras clave BREAK y CONTINUE.
Sintaxis
WHILE Boolean_expression
{sql_statement | statement_block}
[BREAK]
{sql_statement | statement_block}
[CONTINUE]
Argumentos
Boolean_expression
Es una expresión que devuelve TRUE o FALSE. Si la expresión booleana contiene
una instrucción SELECT, la instrucción SELECT debe ir entre paréntesis.
{sql_statement | statement_block}
Se trata de cualquier instrucción o grupo de instrucciones Transact-SQL definidos
con un bloque de instrucciones. Para definir un bloque de instrucciones, utilice las
palabras clave de control de flujo BEGIN y END.
BREAK
Hace que se salga del bloque WHILE más interno. Se ejecutan las instrucciones
que aparecen después de la palabra clave END, que marca el final del ciclo.
CONTINUE
Hace que se reinicie el ciclo WHILE y omite las instrucciones que haya después
de la palabra clave CONTINUE.
28
SQL Server 2000
Observaciones
Si dos o más ciclos WHILE están anidados, la instrucción BREAK interna sale al
siguiente ciclo más externo. Primero se ejecutan todas las instrucciones que haya
después del final del ciclo interno y, a continuación, se reinicia el siguiente ciclo
más externo.
Ejemplo
En este ejemplo, si el promedio de precio es menor de 30, el bucle WHILE dobla
los precios y, a continuación, selecciona el precio máximo. Si el precio máximo es
menor o igual que 50, el ciclo WHILE se reinicia y dobla los precios de nuevo. Este
bucle continúa la duplicación de precios hasta que el precio máximo sea mayor
que 50 y, a continuación, sale del ciclo WHILE e imprime un mensaje.
29
SQL Server 2000
Utilizar Comentarios
Los comentarios son cadenas de texto que no se ejecutan incluidas en el código
de un programa; también se conocen como observaciones. Los comentarios se
pueden usar para documentar código o partes deshabilitadas temporalmente de
instrucciones y lotes de Transact-SQL que se están diagnosticando. La utilización
de comentarios hace más fácil el mantenimiento futuro del código del programa.
Los comentarios se usan, a menudo, para guardar el nombre de un programa, el
nombre del autor y las fechas de los cambios importantes del código. Los
comentarios se pueden usar para describir cálculos complicados o para explicar
determinado método de programación.
Microsoft SQL Server admite dos tipos de caracteres para indicar comentarios:
Nota: No usar comentarios dentro de las instrucciones de SQL. Por ejemplo entre
el SELECT y el FROM
30
SQL Server 2000
Los tipos de datos definidos por el usuario se basan en los tipos de datos del
sistema de Microsoft SQL Server 2000. Se pueden utilizar cuando varias tablas
deben almacenar el mismo tipo de datos en una columna y desea asegurarse de
que dichas columnas tienen exactamente el mismo tipo de datos, longitud y
condición que la aceptación de valores NULL. Por ejemplo, es posible crear un
tipo de datos definido por el usuario con el nombre CodigoPostal a partir del tipo
de datos char.
Cuando cree un tipo de datos definido por el usuario, deberá suministrar estos tres
parámetros:
• Nombre
Sintaxis:
sp_addtype [@typename =] utTipoDatoFisico,
[@phystype =] tipoDatoFisico
[, [@nulltype =] 'tipoNull']
31
SQL Server 2000
TipoNull Este parámetro puede tener dos valores NULL o NOT NULL.
El default, en caso de que no se especifique, es el valor
NULL.
Nota : En caso de que alguno de los parámetros tengan espacio o paréntesis, este
se deberá poner entre comillas simples.
Ejemplo:
Exec Sp_addtype utNombre , ‘varchar(20)’, ‘NOT NULL’
Exec Sp_addtype utFecFactura, datetime, NULL
Sintaxis:
Sp_droptype ‘NomTipoDato’
Ejemplo:
Exec sp_droptype ‘utNombre’
32
SQL Server 2000
Creación de Tablas
Cuando se crea una tabla, se deberá especificar el nombre de la tabla, nombre de
las columnas y el tipo de datos de las columnas. Los nombres de las columnas
deberán ser únicos para una tabla en específico. No deberá de existir un campo
que se llame igual en dos tablas y tenga significado diferente. Algunos nombres
recomendados para campos de uso común son los siguientes.
Ejemplo:
EmpleadoPk
OperacionPk
Sintaxis
Ejemplo:
CREATE TABLE Negocio
( NegocioPk SmallInt NOT NULL,
NomNegocio VarChar(40) NOT NULL,
DomNegocio VarChar(60) NULL,
RFCNegocio VarChar(15) NULL )
33
SQL Server 2000
Sintaxis:
Ejemplo:
DROP TABLE Negocio
Ejemplo:
ALTER TABLE Negocio ADD TelNegocio Varchar(24) NULL
ALTER TABLE NomTabla DROP COLUMN NomColumna
Ejemplo:
ALTER TABLE Negocio DROP COLUMN TelNegocio
34
Módulo 4: Implementando Integridad de Datos
Integridad de los Datos
La Integridad de los Datos garantiza la calidad de los datos de la base de datos.
Por ejemplo, si se especifica para un Cliente el valor de su columna NegocioPk =
1, la base de datos no debe permitir que ningún otro Negocio tenga el mismo valor
de identificador. Si tiene una columna RFCNegocio para la que se prevea que en
las primeras 4 posiciones sean letras el siguiente un guión, enseguida 6 números,
seguidos de un guión y por ultimo 2 letras y un número, la base de datos no debe
aceptar que se tecleen valores que no se correspondan con esa definición. En la
tabla de Cliente hay una columna NegocioPk en la que se almacene el número de
Negocio al que pertenece ese cliente, la base de datos sólo debe permitir valores
que correspondan a los números de Negocio de la tabla Negocio. Dos pasos
importantes en el diseño de las tablas son la identificación de valores válidos para
una columna y la determinación de cómo forzar la integridad de los datos en la
columna. Hay cuatro categorías de integridad de datos:
!"Integridad de entidad.
!"Integridad de dominio.
!"Integridad referencial.
!"Integridad definida por el usuario.
Integridad de Entidad
La integridad de entidad define una fila como entidad única para una tabla
determinada. La integridad de entidad fuerza la integridad de la columna o
columnas de los identificadores o la clave principal de una tabla (mediante índices,
restricciones UNIQUE, restricciones PRIMARY KEY o propiedades IDENTITY).
35
Integridad de Dominio
La integridad de dominio viene dada por la validez de las entradas para una
columna determinada. Puede forzar la integridad de dominio si restringe el tipo
(mediante tipos de datos), el formato (mediante las reglas RULE y las restricciones
CHECK), o el intervalo de valores posibles (mediante restricciones FOREIGN
KEY, restricciones CHECK, definiciones DEFAULT, definiciones NOT NULL y
reglas).
Integridad Referencial
La integridad referencial protege las relaciones definidas entre las tablas cuando
se crean o se eliminan registros. En Microsoft SQL Server 2000, la integridad
referencial se basa en las relaciones entre las llaves foráneas y las llaves
primarias o entre las claves externas y las claves únicas. La integridad referencial
garantiza que los valores clave son coherentes en las distintas tablas. Para
conseguir esa coherencia, es preciso que no haya referencias a valores
inexistentes y que, si cambia el valor de una clave, todas las referencias a ella se
cambien en consecuencia en toda la base de datos.
Cuando se fuerza la integridad referencial, SQL Server impide a los usuarios:
36
Integridad Definida por el Usuario
La integridad definida por el usuario le permite definir reglas de la compañía
específicas que no pertenecen a ninguna otra categoría de integridad. Todas las
categorías de integridad son compatibles con la integridad definida por el usuario.
Constraints (Restricciones)
Los constraints son restricciones que se le adicionan a la base de datos con el
objeto de mantener la integridad referencial de manera automática (PRIMARY
KEY Y FOREIGN KEY), así como la integridad de Dominio a través de Defaults y
Checks.
Cuando existe un índice único, las instrucciones UPDATE o INSERT que generen
valores de clave duplicada se deshacen y SQL Server muestra un mensaje de
error. Esto se cumple incluso si las instrucciones UPDATE o INSERT cambian
muchas filas pero crean un único duplicado. Si se realiza un intento de introducir
datos donde existe un índice único y se ha especificado la cláusula
IGNORE_DUP_KEY, sólo fallarán las filas que infrinjan el índice UNIQUE. Cuando
se procesa una instrucción UPDATE, IGNORE_DUP_KEY no tiene efecto.
37
El siguiente ejemplo crea un índice único ya estando creada la tabla.
Por ejemplo, una restricción anterior podía requerir que los códigos postales
estuvieran limitados a cinco cifras, mientras que una nueva restricción requiere
que los códigos postales sean de nueve cifras. Los datos que figuran en los
antiguos códigos postales de cinco cifras siguen siendo válidos y coexisten con los
nuevos datos de los nuevos códigos postales, que tienen nueve cifras. Por lo
tanto, la nueva restricción sólo debe comprobarse con los nuevos datos.
38
No obstante, conviene actuar con precaución cuando se agrega una restricción sin
comprobar los datos existentes ya que, de ese modo, se omiten los controles de
Microsoft SQL Server que exigen las reglas de integridad para la tabla.
Este ejemplo muestra una restricción con una restricción de modelo sobre los
datos de caracteres introducidos en la columna RFCNegocio de la tabla Negocio
al momento de su creación.
39
• Agregar a una tabla existente, siempre que no exista ya otra restricción
PRIMARY KEY (una tabla sólo puede tener una restricción PRIMARY KEY).
• Modificar o eliminar, si ya existe. Por ejemplo, es posible que desee que la
restricción PRIMARY KEY de la tabla haga referencia a otras columnas o
bien modificar el orden de la columna, el nombre del índice, la opción de
agrupamiento o el factor de relleno de la restricción PRIMARY KEY. No se
puede cambiar la longitud de una columna definida con una restricción
PRIMARY KEY.
Nota Para modificar una restricción PRIMARY KEY mediante Transact-SQL, antes
deberá eliminar la restricción PRIMARY KEY existente y, a continuación, volver a
crearla con la nueva definición.
Si se agrega una restricción PRIMARY KEY a una columna con valores duplicados
o valores NULL, SQL Server devuelve un error y no agrega la restricción. No se
puede agregar una restricción PRIMARY KEY que no cumpla estas reglas. SQL
Server crea automáticamente un índice único para exigir que la restricción
PRIMARY KEY sea única. Si aún no existe un índice agrupado en la tabla o no se
ha especificado explícitamente, se crea un índice agrupado único para exigir la
restricción PRIMARY KEY.
40
Para borrar una restricción de tipo primary Key:
Puede crear una clave externa mediante la definición de una restricción FOREIGN
KEY cuando cree o modifique una tabla.
41
comprobación de la restricción FOREIGN KEY. Cuando se agrega una nueva fila
de datos a una tabla o se cambian los datos de una fila existente, los valores de la
columna o columnas de la clave externa deberán encontrarse en la columna o
columnas de la clave principal de la otra tabla o bien deberán ser NULL.
Nota Una restricción FOREIGN KEY puede hacer referencia a columnas de tablas
de la misma base de datos o a columnas de una misma tabla (tablas con
referencia a sí mismas). Un ejemplo de tabla con referencia a sí misma sería una
tabla de empleados que contuviera tres columnas: númeroEmpleado,
nombreEmpleado y númeroEmpleadoResponsable. Dado que los
responsables también son empleados, hay una relación de clave externa desde la
columna númeroEmpleadoResponsable a la columna númeroEmpleado.
42
optimizadas para su combinación en una consulta que
utilice las claves como criterio.
Nota Para modificar una restricción FOREIGN KEY mediante Transact-SQL, antes
deberá eliminar la restricción FOREIGN KEY existente y, a continuación, volver a
crearla con la nueva definición.
Para crear una restricción FOREIGN KEY durante la creación de una tabla:
Las restricciones de claves de varias columnas se crean como restricciones de
tabla. En la base de datos Facturacion, la tabla Producto incluye una restricción
PRIMARY KEY multicolumna. Este ejemplo muestra cómo hacer referencia a esta
clave desde la tabla DetalleFactura(un nombre explícito de restricción es
opcional).
43
ADD [ CONSTRAINT constraint_name ]
[ FOREIGN KEY ]
REFERENCES ref_table [ ( ref_column ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
Ejemplo: A continuación se muestra cómo se crea una llave foránea con borrado
en cascada (el valor predeterminado es NO ACTION), en la definición de la tabla.
Ejemplo
Para crear una restricción FOREIGN KEY en una tabla existente
con actualización en cascada (el valor predeterminado es NO
ACTION)
44
Regla (RULE)
Objeto de base de datos enlazado a una columna o tipo de datos definido por el
usuario que especifica los datos que se pueden escribir en dicha columna. Cada
vez que un usuario escribe o modifica un valor (con una instrucción INSERT o
UPDATE), SQL Server lo comprueba contra la regla más reciente enlazada a la
columna especificada, por ejemplo, para comprobar los límites o listas. Los datos
escritos antes de la creación y enlace de una regla no se comprueban. Cuando se
crea un objeto llamado Regla. Cuando se enlaza una regla a una columna o un
tipo de datos definido por el usuario, especifica los valores aceptables que se
pueden insertar en esa columna. Las reglas, que son una característica de
compatibilidad con versiones anteriores, realizan algunas de las mismas funciones
que las restricciones de comprobación. Las restricciones CHECK, creadas
mediante la palabra clave CHECK de ALTER o CREATE TABLE, son la forma
preferida y estándar de restringir los valores de una columna (se pueden definir
restricciones múltiples en una o múltiples columnas). Una columna o tipo de datos
definido por el usuario sólo puede tener una regla enlazada. Sin embargo, una
columna puede tener una regla y una o más restricciones de comprobación
asociadas con ella. Cuando esto es así, se evalúan todas las restricciones.
Sintaxis
CREATE RULE regla
AS expresiónCondición
Argumentos
regla
Es el nombre de la nueva regla. Los nombres de las reglas deben cumplir las
reglas de los identificadores. Especificar el nombre del propietario de la regla es
opcional.
expresiónCondición
Son las condiciones que definen la regla. Una regla puede ser cualquier expresión
que sea válida en una cláusula WHERE y puede incluir elementos como
operadores aritméticos, operadores relacionales y predicados (por ejemplo, IN,
LIKE, BETWEEN). Una regla no puede hacer referencia a columnas u otros
objetos de base de datos. Se pueden incluir funciones integradas que no hagan
referencia a objetos de base de datos.
Observaciones
La instrucción CREATE RULE no puede combinarse con otras instrucciones
Transact-SQL en un único proceso por lotes. Las reglas no se aplican a los datos
ya existentes en la base de datos en el momento en que se crearon las reglas y no
45
se pueden enlazar a los tipos de datos del sistema. Una regla sólo se puede crear
en la base de datos actual. Una vez creada la regla, ejecute sp_bindrule para
enlazarla a una columna o a un tipo de datos definido por el usuario.
La regla debe ser compatible con el tipo de datos de la columna. Una regla no se
puede enlazar a una columna text, image o timestamp. Asegúrese de incluir las
constantes de fecha y de caracteres entre comillas simples (‘) y de preceder las
constantes binarias con 0x. Por ejemplo, “@valor LIKE A%” no se puede utilizar
como regla para una columna numérica. Si la regla no es compatible con la
columna a la que se ha enlazado, Microsoft SQL Server devuelve un mensaje de
error cuando se inserte un valor (no cuando se enlaza la regla). Una regla
enlazada a un tipo de datos definido por el usuario sólo se activa cuando se
intenta insertar un valor o actualizar una columna de la base de datos del tipo de
datos definido por el usuario. Como las reglas no prueban las variables, no debe
asignar un valor a una variable de tipo de datos definido por el usuario que sería
rechazada por una regla enlazada a una columna del mismo tipo de datos.
Para obtener un informe de una regla, utilice sp_help. Para mostrar el texto de
una regla, ejecute sp_helptext con el nombre de la regla como parámetro. Para
cambiar el nombre de una regla, utilice sp_rename.
Una regla debe quitarse (mediante DROP RULE) antes de crear otra con el mismo
nombre y debe cancelarse el enlace (mediante sp_unbindrule) antes de quitarla.
Utilice sp_unbindrule para cancelar el enlace de una regla a una columna. Una
nueva regla se puede enlazar a una columna o tipo de datos sin cancelar el enlace
de la anterior; la nueva regla anula la anterior. Las reglas enlazadas a columnas
tienen siempre preferencia sobre las reglas enlazadas a tipos de datos definidos
por el usuario. Enlazar una regla a una columna substituye una regla ya enlazada
al tipo de datos definido por el usuario de esa columna. Pero el enlace de una
regla a un tipo de datos no substituye una regla enlazada a una columna de ese
tipo de datos definido por el usuario.
Si una columna tiene un valor predeterminado y una regla asociada a ella, el valor
predeterminado debe encontrarse en el dominio definido por la regla. Un valor
predeterminado que esté en conflicto con una regla no se inserta nunca. SQL
Server genera un mensaje de error cada vez que intenta insertar tal valor
predeterminado.
Ejemplos
Regla con una lista. Este ejemplo crea una regla que
restringe los valores actuales que se escriben en las
columnas a las que la regla está enlazada, a sólo aquellos
enumerados en la regla.
46
Regla con un modelo. Este ejemplo crea una regla que sigue un
modelo de dos caracteres cualquiera con un guión a
continuación, cualquier número de caracteres (o no
caracteres) y un entero entre 0 y 9 al final.
47
Módulo 5: Planeando Índices
Índices
Los índices de una base de datos son similares a los índices que hay en los libros.
En un libro, un índice le permite encontrar información rápidamente sin necesidad
de leer todo el libro. En una base de datos, un índice permite que el programa de
la base de datos busque datos en una tabla sin necesidad de examinar toda la
tabla. El índice de un libro es una lista de palabras con los números de las páginas
en las que se encuentra cada palabra. Un índice de una base de datos es una lista
de los valores de una tabla con las posiciones de almacenamiento de las filas de
la tabla donde se encuentra cada valor. Se puede crear índices en una sola
columna o en una combinación de columnas de una tabla; los índices se
implementan en forma de árboles B. Un índice contiene una entrada con una o
varias columnas (la clave de búsqueda) de cada fila de una tabla. Un árbol B se
ordena con la clave de búsqueda y se puede buscar de forma eficiente en
cualquier subconjunto principal de la clave de búsqueda. Por ejemplo, un índice en
las columnas A, B y C puede buscarse de forma eficiente en A, en A y B, y en A,
B y C.
Mientras que la mayor parte de los libros contienen un índice general de palabras,
nombres, lugares, etc., las bases de datos contienen índices individuales para
tipos o columnas de datos seleccionados. Es como un libro con un índice para los
nombres de las personas y otro índice para los lugares. Cuando cree una base de
datos y la optimice para mejorar el rendimiento, es recomendable que cree índices
para las columnas que se utilizan en las consultas con el fin de buscar datos. En la
base de datos de ejemplo Ferretera suministrada por este manual, la tabla
Negocio tiene un índice en la columna NegocioPk. En la siguiente ilustración se
muestra cómo almacena el índice para cada valor NegocioPk y señala a las filas
de datos de la tabla con cada valor.
48
Cuando SQL Server ejecuta una instrucción para buscar datos en la tabla Negocio
a partir de un valor de NegocioPk específico, reconoce el índice para la columna
NegocioPk y lo utiliza para buscar los datos. Si no hay un índice, empieza desde
el principio de la tabla y va buscando, fila por fila, el valor de NegocioPk
especificado.
SQL Server crea automáticamente índices para determinados tipos de
restricciones (por ejemplo, restricciones de clave principal (PRIMARY KEY) y de
no duplicados (UNIQUE). También puede personalizar las definiciones de la tabla
mediante la creación de índices independientes de las restricciones.
No obstante, las ventajas que ofrecen los índices por lo que respecta al
rendimiento también tienen un costo. Las tablas con índices necesitan más
espacio de almacenamiento en la base de datos. Asimismo, es posible que los
comandos de inserción, actualización o eliminación de datos sean más lentos y
precisen más tiempo de proceso para mantener los índices. Cuando diseñe y cree
índices, deberá asegurarse de que las ventajas en el rendimiento compensan
suficientemente el costo adicional en cuanto a espacio de almacenamiento y
recursos de proceso.
Un índice de SQL Server es una estructura asociada con una tabla que aumenta
la rapidez de la obtención de las filas de la tabla. Un índice contiene claves
generadas a partir de una o varias columnas de la tabla. Dichas claves están
almacenadas en una estructura que permite que SQL Server busque rápida y
eficientemente la fila o filas asociadas con los valores de cada clave.
49
• Busca filas con valores de clave de búsqueda en un intervalo de valores
(consulta de intervalo). En una consulta de intervalo, la consulta especifica
cualquier entrada con un valor que se encuentre entre otros dos valores.
Por ejemplo:
WHERE job_lvl BETWEEN 9 and 12
o bien,
WHERE job_lvl >= 9 and job_lvl <= 12
• Recorre las filas en orden para posibilitar una operación basada en una
ordenación, como una combinación de mezcla y un agregado de secuencia,
sin una operación de ordenación explícita.
• Busca filas que coincidan entre dos tablas para las que se ha definido una
restricción FOREIGN KEY.
Las consultas que utilizan comparaciones LIKE pueden mejorar con un índice si
los patrones empiezan con una cadena de caracteres específica, como 'abc%',
pero no si empiezan con una búsqueda en la que se utilizan caracteres comodín
(por ejemplo '%xyz').
En muchas consultas es posible combinar las ventajas de los índices. Por ejemplo,
un índice habilita una consulta de intervalo además de cubrir la consulta. SQL
Server puede utilizar varios índices para una sola tabla en la misma consulta, así
como combinar varios índices (con un algoritmo de combinación) para que las
claves de búsqueda cubran una consulta conjuntamente. Además, SQL Server
determina automáticamente qué índices pueden aprovecharse para una consulta y
garantiza que todos los índices se mantengan para una tabla cuando ésta se
modifica.
Microsoft SQL Server 2000 admite índices definidos en cualquier columna de una
tabla. Si se crea una tabla sin índices, los datos de las filas no están ordenados de
ninguna forma concreta o sea estructura de datos amontonados. Los dos tipos de
índice de SQL Server son:
50
!"CLUSTERED (Agrupados)
Los índices agrupados ordenan y almacenan las filas de los datos de la
tabla de acuerdo con los valores de la clave del índice. Como las filas de los
datos están almacenadas siguiendo el orden de la clave del índice
agrupado, los índices agrupados son eficientes para buscar filas. Sólo
puede haber un índice agrupado por cada tabla, porque las filas de datos
sólo pueden estar ordenadas de una forma. Las propias filas de datos
forman el nivel inferior de los índices agrupados. La única ocasión en la que
las filas de datos de una tabla están ordenadas es cuando la tabla contiene
un índice agrupado. Si una tabla no tiene un índice agrupado, sus filas de
datos están almacenadas como datos amontonados.
La única vez que las filas de una tabla se almacenan en una secuencia específica
es cuando se crea un índice agrupado sobre la tabla. Entonces, las filas de datos
se almacenan en una secuencia basada en la clave del índice agrupado. Si una
tabla tiene sólo índices no agrupados, sus filas de datos se almacenan en un
montón desordenado.
Los índices pueden ser únicos, lo que significa que ninguna fila puede tener el
mismo valor que otra en la clave del índice. De lo contrario, el índice no es único y
varias filas pueden compartir el mismo valor de clave. En SQL Server hay dos
formas de definir índices. La instrucción CREATE INDEX crea y asigna el nombre
de un índice. La instrucción CREATE TABLE acepta las siguientes restricciones
que crean índices:
•PRIMARY KEY crea un índice único que implementa una clave principal.
•UNIQUE crea un índice único.
•CLUSTERED crea un índice agrupado.
•NONCLUSTERED crea un índice no agrupado.
Los índices no sólo aceleran la obtención de las filas que se seleccionan, también
aumentan la velocidad de las actualizaciones y las eliminaciones. Esto se debe a
que SQL Server también tiene que buscar las filas para actualizarlas o eliminarlas.
El aumento de eficiencia en la búsqueda de filas que se obtiene gracias al índice
51
compensa normalmente la carga de trabajo extra necesaria para actualizar dichos
índices, a menos que la tabla tenga muchos índices.
Este ejemplo muestra la sintaxis Transact-SQL para crear índices en una tabla.
Sp_helpindex Negocio
Nota Importante:
Los índices Clustered permiten el bloqueo por registro de manera que se mejora la
concurrencia minimizando la posibilidad de que los procesos caigan en un Dead
Lock.
52
Arquitectura de tablas e índices
Los objetos de una base de datos de Microsoft SQL Server 2000 se almacenan
como una colección de páginas de 8 KB. Este tema describe el modo en que se
organizan las páginas de tablas e índices.
SQL Server 2000 admite índices en las vistas. El primer índice permitido en una
vista es un índice agrupado. En el momento en que se ejecuta una instrucción
CREATE INDEX en una vista, el conjunto de resultados para la vista se
materializa y almacena en la base de datos con la misma estructura que una tabla
que tiene un índice agrupado. El conjunto de resultados que se almacena es el
mismo que produce esta instrucción.
Las filas de datos para cada tabla o vista indexada se almacenan en una colección
de páginas de datos de 8 KB. Cada página de datos dispone de una cabecera de
96 bytes que contiene información del sistema como el identificador (Id.) de la
tabla que es propietaria de la página. La cabecera de página también incluye
punteros a las páginas anteriores y siguientes que se utilizan si las páginas se
vinculan a una lista. Al final de la página se encuentra una tabla de
desplazamiento de filas. Las filas de datos ocupan el resto de la página.
53
DBCC SHOWCONTIG
Presenta información de la fragmentación de los datos y los índices de la tabla
especificada.
Sintaxis
DBCC SHOWCONTIG
[ ( { table_name | table_id | view_name | view_id }
[ , index_name | index_id ]
)
]
[ WITH { ALL_INDEXES
| FAST [ , ALL_INDEXES ]
| TABLERESULTS [ , { ALL_INDEXES } ]
[ , { FAST | ALL_LEVELS } ]
}
]
Argumentos
54
Observaciones
El valor de Avg. Bytes free per page y Avg. Page density (full) del conjunto de
resultados ofrecen una indicación del relleno de las páginas de índices. El valor de
Avg. Bytes free per page debe ser bajo y el valor de Avg. Page density (full)
debe ser alto. Quitar y volver a crear un índice agrupado, con la opción
FILLFACTOR especificada, puede mejorar estas estadísticas. Además, el
comando DBCC INDEXDEFRAG compactará un índice, teniendo en cuenta su
FILLFACTOR, lo que mejorará las estadísticas.
El nivel de fragmentación de un índice puede determinarse de dos formas:
55
Nota: Este método de determinación de la fragmentación no funciona si el
índice abarca varios archivos. El valor de Extent Switches debería ser muy
parecido al de Extents Scanned. Esta relación se calcula como el valor
Scan Density, que debería ser tan alto como fuera posible. Esto se puede
mejorar con el método de reducción de la fragmentación que se ha tratado
anteriormente.
Conjuntos de resultados
56
Extent Scan Fragmentation Porcentaje de extensiones sin orden al recorrer las
Fragmentación del páginas hoja de un índice. Este valor no es
recorrido de extensión relevante para los montones. Una extensión sin
orden es aquella en que la extensión que contiene
la página actual de un índice no es físicamente la
extensión siguiente a la que contiene la página
anterior de un índice.
Avg. Bytes free per page Valor promedio de los bytes libres de las páginas
Promedio de bytes libres examinadas. Cuanto mayor sea este valor, menos
por página páginas llenas hay. Los valores bajos son buenos
indicadores. Este valor también está influido por el
tamaño de la fila; un tamaño de fila grande puede
provocar valores altos.
Avg. Page density (full) Densidad de página promedio (como porcentaje).
Promedio de densidad de Este valor tiene en cuenta el tamaño de la fila, de
página (completa) forma que es una medida más precisa del grado de
ocupación de las páginas. Cuanto mayor sea el
porcentaje, mejor.
57
Módulo 6: Consultando Información
Consultas de Múltiples Tablas
58
La selección devuelve la información de los productos y proveedores de cualquier
combinación de partes suministrada por una empresa cuyo nombre empieza con
la letra F y el precio del producto es superior a 10 pesos.
Cuando en una consulta simple se hace referencia a múltiples tablas, ninguna de
las referencias a las columnas debe ser ambigua. En el ejemplo anterior, ambas
tablas, Producto y Negocio, tienen una columna llamada NegocioPk. Cualquier
nombre de columna que esté duplicado en varias tablas a las que se hace
referencia en la consulta debe ser calificado con el nombre de la tabla. Todas las
referencias a las columnas NegocioPk del ejemplo se califican.
59
Aunque las condiciones de combinación suelen tener comparaciones de igualdad
(=), también se puede especificar otros operadores de comparación o relacionales,
así como otros predicados.
Cuando SQL Server procesa Joins, el motor de consultas elige el método más
eficiente entre varias posibilidades para procesar la combinación. Aunque la
ejecución física de varias combinaciones utiliza muchas optimizaciones distintas,
la secuencia lógica es:
• Se aplican las condiciones de combinación de la cláusula FROM.
• Las condiciones de combinación y de búsqueda de la cláusula WHERE.
• Se aplican las condiciones de búsqueda de la cláusula HAVING.
60
A.NomNegocio P.NomProducto P.Precio
--------------------- ------------------------ --------------
Ferretera Papalo Tornillo 0.50
Ferretera Papalo Taladros 300
Ferretera Abraham Arena 200
Ferretera Abraham Alambron 550
61
Este es el conjunto de resultados:
NomCliente NomNegocio
------------------------------------------------------- -----------------------------------------
Erick Guzmán NULL
Luis Eduardo Medina NULL
Ivan Cruz Guzmán Ferretera Abraham
Ios Cruz Ferretera Papalo
LEFT OUTER JOIN incluye en el resultado todas las filas de la tabla Cliente, tanto
si hay una coincidencia en la columna ciudad de la tabla Negocio como si no la
hay. Observe que, en los resultados, no hay datos coincidentes con la mayor parte
de los Clientes enumerados, con lo que estas filas contienen valores NULL en la
columna NomNegocio.
NomCliente NomNegocio
----------------------------------------------- ------------------------------------------------------------
Ivan Cruz Guzmán Ferretera Abraham
NULL Ferretera la Nueva
Ios Cruz Ferretera Papalo
62
JOIN, indica que todas las filas de ambas tablas se van a incluir en los resultados,
con independencia de que haya datos coincidentes en las tablas.
Para incluir todos los Negocios y todos los Clientes en el resultado, sin tener en
cuenta si un Cliente se encuentra en la misma ciudad, use una combinación
externa completa. A continuación se muestran la consulta y los resultados de la
combinación externa completa de Transact-SQL:
NomCliente NomNegocio
-------------------------------------------------- ----------------------------------------------------
Erick Guzmán NULL
Luis Eduardo Medina NULL
Ivan Cruz Guzmán Ferretera Abraham
NULL Ferretera la Nueva
Ios Cruz Ferretera Papalo
63
Sin embargo, si se agrega una cláusula WHERE, la combinación cruzada se
comporta como una combinación interna. Por ejemplo, las siguientes consultas de
Transact-SQL producen el mismo conjunto de resultados:
64
Consultas Avanzadas
SELECT Producto.NomProducto
FROM Producto
WHERE Producto.ProductoPk = (SELECT Distinct A.ProductoPk
FROM DetalleFactura A
Where Producto.NegocioPk = A.NegocioPk and
Producto.ProductoPk = A.ProductoPk
)
Select NomProducto
From Producto A Inner Join DetalleFactura B On
A.NegocioPk = B.NegocioPk And A.ProductoPk = B.ProductoPk
65
Una subconsulta anidada en la instrucción externa SELECT tiene los siguientes
componentes:
• Una consulta SELECT normal, que incluye los componentes normales de la
lista de selección.
• Una cláusula normal FROM que incluye uno o más nombres de tablas o
vistas.
• Una cláusula opcional WHERE.
• Una cláusula opcional GROUP BY.
• Una cláusula opcional HAVING.
66
Subconsultas con IN
El resultado de una subconsulta presentada con IN (o con NOT IN) es una lista de
cero o más valores. Una vez que la consulta devuelve los resultados, la consulta
externa hace uso de ellos.
En esta consulta se buscan los nombres de los Clientes que tienen alguna factura:
SELECT A.NomCliente
FROM Cliente A
WHERE ClientePk IN
(SELECT Distinct B.ClientePk
FROM Factura B
WHERE A.NegocioPk = B.NegocioPk)
Esta instrucción se evalúa en dos pasos. Primero, la consulta interna devuelve los
números de identificación de los clientes en el que el negocio donde efectuó la
compra coincida. Segundo, estos valores se sustituyen en la consulta externa, que
busca los nombres de los clientes asociados con los números de identificación en
la tabla de Clientes.
SELECT A.NomCliente
FROM Cliente A
WHERE ClientePk NOT IN (SELECT Distinct B.ClientePk FROM Factura B
WHERE A.NegocioPk = B.NegocioPk)
67
Subconsultas en las instrucciones UPDATE, DELETE e INSERT
Las subconsultas se pueden anidar en las instrucciones UPDATE, DELETE e
INSERT, así como en las instrucciones SELECT.
La siguiente consulta dobla el PrecioVenta de todos los Productos del Negocio
Ferretera Papalo. La consulta actualiza la tabla Producto; su subconsulta hace
referencia a la tabla Negocio.
UPDATE Producto
SET PrecioVenta = PrecioVenta * 2
WHERE ProductoPk IN
(SELECT ProductoPk
FROM Negocio
WHERE NomNegocio = 'Ferretera Papalo' AND Negocio.NegocioPk =
Producto.NegocioPk)
Puede quitar todos los registros de ventas del 05/Abril/2001 con esta consulta
anidada:
DELETE DetalleFactura
WHERE ConsecPk IN
(SELECT ConsecPk
FROM Factura
WHERE FecFactura = '2001/04/05')
DELETE DetalleFactura
FROM DetalleFactura INNER JOIN Factura ON DetalleFactura.ConsecPk =
Factura.ConsecPk AND Factura.FecFactura = '2001/02/02'
68
Se preguntarán el por qué en dos pasos y no en uno solo, la causa es que si se
efectúa en un solo paso ocurre un bloqueo en tablas del TempDb de SQL Server y
genera que ninguna otra base de datos pueda trabajar de manera concurrente.
Por ejemplo, quiere determinar qué producto se facturó a un precio de venta más
alto que el especificado en la tabla de producto:
69
En esta consulta se busca el nombre de los Clientes a quienes se les facturó.
SELECT NomCliente
FROM Cliente
WHERE EXISTS
(SELECT * FROM Factura WHERE Factura.ClientePk = Cliente.ClientePk
AND Factura.NegocioPk = Cliente.NegocioPk AND Factura.FolFactura <> 0)
NomCliente
------------------------------------------------------------
Ivan Cruz Guzmán
Erick Guzmán
SELECT NomCliente
FROM Cliente
WHERE NOT EXISTS
(SELECT * FROM Factura WHERE Factura.ClientePk = Cliente.ClientePk
AND Factura.NegocioPk = Cliente.NegocioPk AND Factura.FolFactura <> 0)
70
Sumando Datos
-----------------------------------------------------
4071.0000
Con esta consulta, puede averiguar el precio promedio de todos los productos si
se doblaran los precios.
SUM, AVG, COUNT, MAX y MIN pasan por alto los valores NULL; COUNT(*) no lo
hace.
71
La palabra clave opcional DISTINCT se puede usar con SUM, AVG y COUNT para
eliminar los valores duplicados antes de que se establezca la función de agregado
(el valor predeterminado es ALL).
SUM y AVG se pueden usar sólo con columnas numéricas, como, por ejemplo, las
de los tipos de datos int, smallint, tinyint, decimal, numeric, float, real, money
y smallmoney. MIN y MAX no se pueden usar con tipos de datos bit. El resto de
las funciones de agregado que no sean COUNT(*) no se puede usar con los tipos
de datos text e image.
Con estas excepciones, las funciones de agregado se pueden usar con cualquier
tipo de columna. Por ejemplo, en una columna del tipo de datos character, use
MIN (mínimo) para buscar el valor inferior, el más cercano al principio del alfabeto:
SELECT MIN(NomProducto)
FROM Producto
Éste es el conjunto de resultados:
--------------------
Cable No 12
El tipo de resultado que devuelve una función de agregado puede tener una
precisión mayor que las entradas, siempre que sea suficientemente grande para
contener el valor del resultado de agregado. Por ejemplo, las funciones SUM o
AVG devuelven un valor int cuando el tipo de datos de entrada es smallint o
tinyint.
72
Agrupar filas con GROUP BY
Cuando se usan sin una cláusula GROUP BY, las funciones de agregado sólo
devuelven un valor de agregado para la instrucción SELECT. La cláusula GROUP
BY se usa para producir valores de agregado para cada fila del conjunto de
resultados.
73
Por ejemplo, TableX contiene:
SELECT ColumnA,
MAX(ColumnB) AS MaxB,
SUM(ColumnC) AS SumC
FROM TableX
GROUP BY ColumnA
Esta selección devuelve dos filas, una por cada valor exclusivo de ColumnA:
Puesto que GROUP BY sólo puede devolver una fila con el valor 1 en ColumnA,
no hay forma de devolver los tres valores de ColumnB (abc, def y ghi) asociados
con el valor 1 de ColumnA.
74
Nota: No es posible utilizar GROUP BY o HAVING en columnas ntext, text,
image o bit a menos que se encuentren en una función que devuelva un valor que
tiene otro tipo de datos, como SUBSTRING o CAST.
-----------------------------------------------------
150.25
Sin DISTINCT, la función AVG busca el precio promedio de todos los títulos del
negocio especificado.
SELECT AVG(PrecioVenta)
FROM Producto
WHERE NegocioPk = 10
Nota: Los valores NULL de una columna se pasan por alto mientras opera una
función de agregado.
Utilizar COUNT(*)
COUNT(*) no requiere un parámetro expresión porque, por definición, no usa
información de ninguna columna en particular. Cuenta el número total de filas que
cumplen las calificaciones de la consulta. COUNT(*) devuelve el número de filas
que coinciden con las condiciones de búsqueda especificadas en la consulta, sin
eliminar los duplicados. Cuenta cada fila por separado, incluidas las filas que
contienen valores NULL.
75
En esta consulta se busca el número total de productos de la tabla Producto:
SELECT COUNT(*)
FROM Producto
----------- -----------------------------------------------------
3 350.0
(1 row(s) affected)
76
Este es el conjunto de resultados:
ProductoPk Total
---------------- -----------------------------------------------------
2 300.0
(1 row(s) affected)
SELECT UnidadMedida
FROM Producto
GROUP BY UnidadMedida
HAVING UnidadMedida LIKE 'p%'
UnidadMedida
--------------------
Pieza
77
Resumir Datos con COMPUTE y COMPUTE BY
Genera totales que aparecen como columnas de resumen adicionales al final del
conjunto de resultados. Cuando se utiliza con BY, la cláusula COMPUTE genera
interrupciones de control y subtotales en el conjunto de resultados. Puede
especificar COMPUTE BY y COMPUTE en la misma consulta.
Cuando se especifica COMPUTE con la cláusula opcional BY, hay dos conjuntos
de resultados por cada grupo que califica la instrucción SELECT:
Cuando se especifica COMPUTE sin la cláusula opcional BY, hay dos conjuntos
de resultados para la instrucción SELECT:
• El segundo conjunto de resultados tiene una fila que contiene los totales de
las funciones de agregado especificadas en la cláusula COMPUTE.
Sintaxis
[ COMPUTE
{ { AVG | COUNT | MAX | MIN | STDEV | STDEVP
| VAR | VARP | SUM }
( expression ) } [ ,...n ]
[ BY expression [ ,...n ] ]
]
78
Argumentos
( expression )
Una expresión, por ejemplo, el nombre de una columna en la que se realiza el
cálculo. El argumento expression debe aparecer en la lista de selección y se debe
especificar exactamente igual que una de las expresiones de la lista de selección.
En expression no se puede utilizar un alias de columna especificado en la lista de
selección.
Nota No se puede especificar los tipos de datos ntext, text o image en una
cláusula COMPUTE o en una cláusula COMPUTE BY.
79
BY expression
Genera interrupciones de control y subtotales en el conjunto de resultados.
80
Recomendaciones para Optimizar Consultas
Algunas consultas utilizan intrínsecamente recursos de forma intensiva. Esto está
relacionado con aspectos fundamentales de bases de datos e índices. Estas
consultas no son ineficaces, debido a que el optimizador implementará las
consultas de la forma más eficaz posible. Sin embargo, utilizan recursos de forma
intensiva y la naturaleza orientada a conjuntos de Transact-SQL puede hacer que
parezcan ineficaces. Ningún grado de inteligencia del optimizador de consultas
puede eliminar el costo intrínseco de recursos de estas construcciones. Son
costosas en comparación con una consulta menos compleja. Aunque Microsoft
SQL Server utilizará un plan de acceso óptimo, está limitado por lo que es
fundamentalmente posible. Por ejemplo, los siguientes tipos de consultas pueden
utilizar recursos de forma intensiva:
• Consultas que devuelven conjuntos de resultados de gran tamaño.
• Cláusulas WHERE no únicas
81
SELECT * FROM Factura
WHERE ClientePk BETWEEN 1 AND 250 AND
FecFactura BETWEEN '2001/01/01' AND '2001/01/02'
SQL Server puede utilizar índices sobre las columnas ClientePk y FecFactura, y
después, realizar una coincidencia hash entre los dos subconjuntos para obtener
la intersección de índices.
82
Módulo 7: Manejando Transacciones y Bloqueos
Transacciones
Una transacción es una secuencia de operaciones realizadas como una sola
unidad lógica de trabajo. Una unidad lógica de trabajo debe exhibir cuatro
propiedades, conocidas como propiedades ACID (atomicidad, coherencia,
aislamiento y durabilidad), para ser calificada como transacción:
Atomicidad
Una transacción debe ser una unidad atómica de trabajo, tanto si se realizan todas
sus modificaciones en los datos, como si no se realiza ninguna de ellas.
Coherencia
Cuando finaliza, una transacción debe dejar todos los datos en un estado
coherente. En una base de datos relacional, se deben aplicar todas las reglas a
las modificaciones de la transacción para mantener la integridad de todos los
datos. Todas las estructuras internas de datos, como índices de árbol B o listas
doblemente vinculadas, deben estar correctas al final de la transacción.
Aislamiento
Las modificaciones realizadas por transacciones simultáneas se deben aislar de
las modificaciones llevadas a cabo por otras transacciones simultáneas. Una
transacción ve los datos en el estado en que estaban antes de que otra
transacción simultánea los modificara o después de que la segunda transacción se
haya concluido, pero no ve un estado intermedio. Esto se conoce como
seriabilidad debido a que su resultado es la capacidad de volver a cargar los datos
iniciales y reproducir una serie de transacciones para finalizar con los datos en el
mismo estado en que estaban después de realizar las transacciones originales.
Durabilidad
Una vez concluida una transacción, sus efectos son permanentes en el sistema.
Las modificaciones persisten aún en el caso de producirse un error del sistema.
83
• Servicios de registro que aseguran la durabilidad de la transacción. Aún en
el caso de que falle el hardware del servidor, el sistema operativo o el
propio SQL Server, SQL Server utiliza registros de transacciones, al
reinicio, para deshacer automáticamente las transacciones incompletas en
el momento en que se produjo el error en el sistema.
Controlar Transacciones
Una transacción es una unidad única de trabajo. Si una transacción tiene éxito,
todas las modificaciones de los datos realizadas durante la transacción se
confirman y se convierten en una parte permanente de la base de datos. Si una
transacción encuentra errores y debe cancelarse o deshacerse, se borran todas
las modificaciones de los datos.
Transacciones explícitas
Transacciones implícitas
Finalizar transacciones
Puede finalizar las transacciones con la instrucción COMMIT o la instrucción
ROLLBACK.
COMMIT
Si una transacción es correcta, confírmela. La instrucción COMMIT garantiza que
todas las modificaciones de la transacción se convierten en una parte permanente
de la base de datos. La instrucción COMMIT también libera recursos que utiliza la
transacción como, por ejemplo, los bloqueos.
84
ROLLBACK
Si se produce un error en una transacción o el usuario decide cancelar la
transacción, deshaga la transacción. La instrucción ROLLBACK deshace todas las
modificaciones realizadas en la transacción al devolver los datos al estado en que
estaban al inicio de la transacción. La instrucción ROLLBACK también libera los
recursos que mantiene la transacción.
85
Bloqueo
SQL Server 2000 utiliza el bloqueo para asegurar la integridad de las
transacciones y la coherencia de las bases de datos. El bloqueo impide que los
usuarios lean los datos que otros están modificando y que varios usuarios
modifiquen los mismos datos de forma simultánea. Si no se utilizan bloqueos, los
datos de la base de datos pueden presentar errores lógicos y las consultas que en
ellos se realicen pueden producir resultados inesperados.
Aunque SQL Server impone el bloqueo de forma automática, se pueden diseñar
aplicaciones más eficaces si se comprende y se personaliza en éstas el bloqueo.
Interbloqueos (DeadLock)
Un interbloqueo se produce cuando hay una dependencia cíclica entre dos o más
subprocesos para algún conjunto de resultados.
Un interbloqueo es una circunstancia que se puede dar en cualquier sistema con
varios subprocesos, no sólo en un sistema de administración de bases de datos
relaciónales. Un subproceso de un sistema que contiene varios subprocesos
puede adquirir uno o más recursos, por ejemplo, bloqueos. Si el recurso que se
desea adquirir pertenece actualmente a otro subproceso, puede que el primer
subproceso deba esperar a que el otro libere el recurso de destino. En
consecuencia, se dice que el subproceso que está en espera depende del
subproceso que posee ese recurso concreto.
Si el subproceso "propietario" desea adquirir otro recurso que actualmente tiene
ocupado el subproceso en espera, la situación que se genera es un interbloqueo:
ninguno de los subprocesos puede liberar el recurso que tiene ocupado hasta que
sus transacciones se confirmen o se anulen, y éstas no pueden confirmarse ni
anularse porque están a la espera de recursos que el otro subproceso tiene
ocupados. Por ejemplo, el subproceso T1 que ejecuta la transacción 1 tiene un
bloqueo exclusivo en la tabla Proveedor. El subproceso T2 que ejecuta la
transacción 2 obtiene un bloqueo exclusivo en la tabla Partes y, a continuación,
desea un bloqueo en la tabla Proveedor. La transacción 2 no puede obtener el
bloqueo debido a que lo tiene la transacción 1. La transacción 2 está bloqueada,
esperando a la transacción 1. La transacción 1, a continuación, desea un bloqueo
en la tabla Partes, pero no puede obtenerlo debido a que la transacción 2 la tiene
bloqueada. Las transacciones no pueden liberar los bloqueos que mantienen
hasta que se confirmen o se anulen. Las transacciones no se pueden confirmar ni
cancelar porque para continuar necesitan un bloqueo que tiene la otra transacción.
86
Módulo 8: Implementando Vistas
Vistas de SQL
Una vista se puede considerar una tabla virtual o una consulta almacenada. Los
datos accesibles a través de una vista no están almacenados en un objeto distinto
de la base de datos. Lo que está almacenado en la base de datos es una
instrucción SELECT. El resultado de la instrucción SELECT forma la tabla virtual
que la vista devuelve. El usuario puede utilizar dicha tabla virtual haciendo
referencia al nombre de la vista en instrucciones Transact-SQL, de la misma forma
en que se hace referencia a las tablas. Las vistas se utilizan para alguna de estas
funciones, o para todas:
Por ejemplo, permitir que un empleado sólo vea las filas que guardan su
trabajo en una tabla de seguimiento de actividad laboral.
• Combinar columnas de varias tablas de forma que parezcan una sola tabla.
Las vistas se crean definiendo la instrucción SELECT que recupera los datos
presentados por la vista. Las tablas de datos a las que hace referencia la
instrucción SELECT se conocen como las tablas base para la vista. En este
ejemplo, vwCliente de la base de datos Facturación es una vista que selecciona
datos de dos tablas base para presentar una tabla virtual de datos frecuentemente
utilizados:
87
SELECT *
FROM vwCliente
Las vistas en todas las versiones de SQL Server son actualizables (pueden ser
objetivo de instrucciones UPDATE, DELETE o INSERT) mientras la modificación
afecte sólo a una de las tablas base de la vista, por ejemplo:
UPDATE vwCliente
SET NomCliente = ‘Ma. Teresa Cardenas Moreno’
WHERE ClientePk = 2 AND NegocioPk = 1
GO
SQL Server 2000 admite tipos más complejos de instrucciones INSERT, UPDATE
y DELETE que hagan referencia a vistas.
Las vistas indexadas son una característica de SQL Server 2000 que mejora
considerablemente el rendimiento de vistas complejas del tipo que se encuentra
normalmente en almacenes de datos u otros sistemas de ayuda a la toma de
decisiones.
Las vistas se denominan tablas virtuales porque el conjunto de resultados de una
vista normalmente no se guarda en la base de datos. El conjunto de resultados de
una vista se incorpora dinámicamente a la lógica de la instrucción y el conjunto de
resultados se genera dinámicamente en tiempo de ejecución.
Las consultas complejas, como las de los sistemas de ayuda a la toma de
decisiones, pueden hacer referencia a un gran número de filas de tablas base y
agregar mucha información en agregados relativamente concisos como sumas o
promedios. SQL Server 2000 admite la creación de un índice agrupado en una
vista que implemente una consulta tan compleja. Cuando se ejecuta la instrucción
CREATE INDEX, el conjunto de resultados de la vista SELECT se almacena en la
base de datos de forma permanente. Las futuras instrucciones SQL que hagan
referencia a la vista tendrán unos tiempos de respuesta sustancialmente mejores.
En la vista se reflejan automáticamente las modificaciones a los datos base.
Este ejemplo creará una vista y un índice de esa vista. A continuación, se incluyen
dos consultas que utilizan la vista indexada.
88
--Activar las siguientes opciones para soportar índices en las vistas
SET NUMERIC_ROUNDABORT OFF
GO
SET
ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABO
RT,QUOTED_IDENTIFIER,ANSI_NULLS ON
GO
--Crea la Vista
CREATE VIEW vwProductos
WITH SCHEMABINDING
AS
SELECT B.ProductoPk, A.ConsecPK, B.Existencia,count_big(*) as Cuenta
FROM dbo.DetalleFactura A, dbo.Producto B
WHERE A.ProductoPk = B.ProductoPk And A.NegocioPk = B.NegocioPk
GROUP BY B.Productopk, A.ConsecPK, B.Existencia
GO
SCHEMABINDING
Enlaza la vista al esquema. Cuando se especifica SCHEMABINDING,
select_statement debe incluir los nombres con dos partes (propietario.objeto) de
las tablas, vistas o funciones definidas por el usuario a las que se hace referencia.
Las vistas o las tablas que participan en una vista creada con la cláusula de
enlace de esquema no se pueden quitar ni alterar, de forma que deja de tener un
enlace de esquema. De lo contrario, SQL Server genera un error. Además, las
instrucciones ALTER TABLE sobre tablas que participan en vistas que tienen
enlaces de esquemas provocarán un error si estas instrucciones afectan a la
definición de la vista.
Las funciones de agregado AVG, MAX, MIN, STDEV, STDEVP, VAR o VARP. Si
se especifican AVG, MAX, MIN, STDEV, STDEVP, VAR o VARP en consultas que
hacen referencia a la vista indexada, el optimizador puede calcular el resultado
89
necesario si la lista de selección de la vista contiene estas funciones de
sustitución:
Sintaxis
DROP VIEW vista [,…n]
90
Módulo 9: Implementando Procedimientos
Almacenados
Procedimientos Almacenados
91
Es posible conceder permisos a los usuarios para ejecutar un
procedimiento almacenado, incluso si no cuentan con permiso para ejecutar
directamente las instrucciones del procedimiento.
92
ROLLBACK TRANSACTION
RETURN 1
END
COMMIT TRANSACTION
RETURN 0
93
Execute NomProcedimiento
Exec NomProcedimiento
Manejo de Errores
RAISERROR
Devuelve un mensaje de error definido por el usuario y establece un indicador del
sistema para registrar que se ha producido un error. Con RAISERROR, el cliente
puede obtener una entrada de la tabla sysmessages o generar un mensaje
dinámicamente con una gravedad definida por el usuario y con información acerca
del estado. Una vez definido, el mensaje se devuelve al cliente como un mensaje
de error del servidor.
Por ejemplo:
RAISERROR ('Existe un Error .', 16, 1)
sp_addmessage
Por ejemplo:
USE master
EXEC sp_addmessage 50001, 16, 'Ejemplo de Error '
94
Desencadenadores (TRIGGERS)
Los desencadenadores de Microsoft SQL Server 2000 son una clase especial de
procedimiento almacenado que se define para que se ejecute automáticamente
cuando se emita una instrucción UPDATE, INSERT o DELETE en una tabla o una
vista. Los desencadenadores son una herramienta eficaz que pueden utilizar los
sitios para exigir automáticamente las reglas comerciales cuando se modifican los
datos. Los desencadenadores amplían la lógica de comprobación de integridad de
las restricciones, valores predeterminados y reglas de SQL Server, aunque se
deben utilizar las restricciones y los valores predeterminados siempre que éstos
aporten toda la funcionalidad necesaria.
95
parámetros. Esto se debe a que los usuarios no esperan que las instrucciones
UPDATE, INSERT o DELETE devuelvan ningún conjunto de resultados.
Puede utilizar la cláusula FOR para especificar cuándo se tiene que ejecutar un
desencadenador:
Los dos principales mecanismos que ofrece Microsoft SQL Server 2000 para exigir
las reglas de empresa y la integridad de datos son: las restricciones y los
desencadenadores. Un desencadenador es un procedimiento almacenado de tipo
especial que actúa automáticamente cuando se modifican los datos de la tabla.
Los desencadenadores se invocan en respuesta a las instrucciones INSERT,
UPDATE y DELETE. Un desencadenador puede consultar otras tablas e incluir
instrucciones de Transact-SQL complejas. El desencadenador y la instrucción que
lo activa se tratan como una sola transacción que puede deshacerse desde el
desencadenador. Si se detecta un error grave (por ejemplo, no hay suficiente
espacio en disco), se deshace automáticamente toda la transacción.
96
Los desencadenadores tienen varias utilidades:
97
• Una restricción CHECK puede validar el valor de una columna únicamente
con relación a una expresión lógica o a otra columna de la misma tabla. Si
la aplicación necesita que se valide el valor de una columna con relación a
una columna de otra tabla, deberá utilizar un desencadenador.
CREATE TRIGGER
Crea un desencadenador, que es una clase especial de procedimiento
almacenado que se ejecuta automáticamente cuando un usuario intenta la
instrucción especificada de modificación de datos en la tabla indicada. Microsoft
SQL Server permite crear varios desencadenadores para cualquier instrucción
INSERT, UPDATE o DELETE.
Sintaxis
98
Argumentos
trigger_name
Es el nombre del desencadenador. Un nombre de desencadenador debe cumplir
las reglas de los identificadores y debe ser único en la base de datos. Especificar
el propietario del desencadenador es opcional.
Table | view
Es la tabla o vista en que se ejecuta el desencadenador; algunas veces se
denomina tabla del desencadenador o vista del desencadenador. Especificar el
nombre del propietario de la tabla o vista es opcional.
WITH ENCRYPTION
Codifica las entradas syscomments que contienen el texto de CREATE
TRIGGER. El uso de WITH ENCRYPTION impide que el desencadenador se
publique como parte de la duplicación de SQL Server.
AFTER
Especifica que el desencadenador sólo se activa cuando todas las operaciones
especificadas en la instrucción SQL desencadenadora se han ejecutado
correctamente. Además, 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, si sólo se especifica la palabra clave FOR.
Los desencadenadores AFTER no se pueden definir en las vistas.
INSTEAD OF
Especifica que se ejecuta el desencadenador en vez de la instrucción SQL
desencadenadora, por lo que se suplantan las acciones de las instrucciones
desencadenadoras.
Como máximo, se puede definir un desencadenador INSTEAD OF por cada
instrucción INSERT, UPDATE o DELETE en cada tabla o vista. No obstante, en
las vistas es posible definir otras vistas que tengan su propio desencadenador
INSTEAD OF.
Los desencadenadores INSTEAD OF no se permiten en las vistas actualizables
WITH CHECK OPTION. SQL Server emitirá un error si se agrega un
desencadenador INSTEAD OF a una vista actualizable donde se ha especificado
WITH CHECK OPTION. El usuario debe quitar esta opción mediante ALTER
VIEW antes de definir el desencadenador INSTEAD OF.
99
ON DELETE en cascada. Igualmente, no se permite la opción UPDATE en tablas
que tengan una relación de integridad referencial que especifica una acción ON
UPDATE en cascada.
AS
Son las acciones que va a llevar a cabo el desencadenador.
sql_statement
Son las condiciones y acciones del desencadenador. Las condiciones del
desencadenador especifican los criterios adicionales que determinan si los
intentos de las instrucciones DELETE, INSERT o UPDATE hacen que se lleven a
cabo las acciones del desencadenador.
SELECT *
FROM deleted
Ejemplo: Manda borrar en cascada todo el detalle de una factura al eliminar esta
100
Ejemplo. Manda un mensaje cuando se agrega o modifica un producto. El
mensaje 50009 es un mensaje definido por el usuario en sysmessages.
Ejemplo. Por medio de este trigger se hace un respaldo del producto modificado
en la tabla ProductoAux
sp_helptrigger 'Factura'
101
Cursores
• Aceptan diferentes grados de visibilidad para los cambios que realizan otros
usuarios en la información de la base de datos que se presenta en el
conjunto de resultados.
Proceso de cursores
Los cursores de Transact-SQL utilizan el siguiente proceso general con todos los
cursores de SQL Server:
3. Recupere las filas del cursor que desea ver. La operación de recuperar una
fila o un bloque de filas de un cursor recibe el nombre de recopilación.
Realizar series de recopilaciones para recuperar filas, ya sea hacia
adelante o hacia atrás, recibe el nombre de desplazamiento.
102
4. Existe la opción de realizar operaciones de modificación (actualización o
eliminación) en la fila de la posición actual del cursor.
5. Cierre el cursor.
Cursores de Transact-SQL.
103
Ejemplo. En el siguiente ejemplo se incrementa el precio de venta en un 10% si la
existencia es menor a 1000 y en caso contrario un 5%
104
Módulo 10: Implementando Funciones Definidas
por el Usuario
Funciones definidas por el usuario
Las funciones son subrutinas formadas por una o varias instrucciones Transact-
SQL que se pueden utilizar para encapsular un código con el fin de utilizarlo de
nuevo posteriormente. Microsoft SQL Server 2000 no limita a los usuarios a las
funciones integradas que vienen definidas como parte del lenguaje Transact-SQL,
sino que les permite crear sus propias funciones definidas por el usuario.
Las funciones definidas por el usuario se crean con la instrucción CREATE
FUNCTION, se modifican con la instrucción ALTER FUNCTION y se quitan con la
instrucción DROP FUNCTION. Todos los nombres de funciones completos
(database_name.owner_name.function_name) definidos por el usuario deben
ser únicos.
Para crear, modificar o quitar funciones definidas por el usuario, debe tener
permisos de CREATE FUNCTION. Los usuarios distintos del propietario deben
tener permiso EXECUTE para una función, y solo así podrán utilizarla en una
instrucción de Transact-SQL. Para crear o modificar tablas con referencias a
funciones definidas por el usuario en la restricción CHECK, la cláusula DEFAULT
o la definición de una columna calculada, también debe tener permiso
REFERENCES para las funciones.
Los errores de Transact-SQL que producen la cancelación de una instrucción y
continúan con la siguiente instrucción del módulo, como desencadenadores o
procedimientos almacenados, se tratan de forma distinta dentro de una función.
En las funciones, estos errores hacen que se detenga la ejecución de la función.
Esto hace que se cancele la función que invocó la instrucción.
SQL Server 2000 admite tres tipos de funciones definidas por el usuario:
• Funciones escalares
Una función definida por el usuario no tiene ninguno o tiene varios parámetros de
entrada y devuelve un valor escalar o una tabla. Una función puede tener un
máximo de 1024 parámetros de entrada. Cuando un parámetro de la función toma
un valor predeterminado, debe especificarse la palabra clave DEFAULT al llamar a
la función para poder obtener el valor predeterminado. Este comportamiento es
diferente del de los parámetros con valores predeterminados de los
105
procedimientos almacenados, para los cuales omitir el parámetro implica
especificar el valor predeterminado. Las funciones definidas por el usuario no
admiten parámetros de salida.
Las funciones escalares devuelven un único valor de datos del tipo definido en la
cláusula RETURNS. Se pueden utilizar todos los tipos de datos escalares,
incluidos bigint y sql_variant. No se admiten el tipo de datos timestamp, los tipos
de datos definidos por el usuario y los tipos de datos no escalares, como table o
cursor. El cuerpo de la función, definido en un bloque BEGIN...END, contiene el
conjunto de instrucciones Transact-SQL que devuelven el valor. El tipo devuelto
puede ser cualquier tipo de datos excepto text, ntext, image, cursor y
timestamp.
Las funciones de valores de tabla devuelven un tipo de datos table. Las funciones
de valores de tabla en línea no tienen cuerpo; la tabla es el conjunto de resultados
de una sola instrucción SELECT. Para una función de valores de tabla de varias
instrucciones, el cuerpo de la función, definido en un bloque BEGIN...END,
contiene las instrucciones TRANSACT-SQL que generan e insertan filas en la
tabla que se va a devolver.
Observaciones
• Instrucciones de asignación.
106
• Instrucciones SELECT que contienen listas de selección con expresiones
que asignan valores a las variables locales para la función.
Invocación a funciones
Funciones Escalares
CREATE FUNCTION [ owner_name. ] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )
RETURNS scalar_return_data_type
[ WITH < function_option> [ [,] ...n] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
107
En este ejemplo, una función definida por el usuario de tipo escalar, PuntoMedio,
toma dos argumentos, el NegocioPk y el ProductoPk y calcula el punto medio de
las existencias en base a su Máximo y Mínimo.
Llamada a la Función:
Este ejemplo devuelve una función de valores de tabla en línea. Esta nos arroja
como resultado el nombre del producto y las cantidades vendidas de éste:
CREATE FUNCTION VentasProducto (@NegocioPk SmallInt, @ProductoPk Int)
RETURNS TABLE
AS
RETURN (SELECT NomProducto, Cantidad
FROM Producto A Inner Join DetalleFactura B On
(A.NegocioPk = B.NegocioPk And A.ProductoPk = B.ProductoPk)
WHERE A.NegocioPk = @NegocioPk And A.ProductoPk = @ProductoPk)
Llamada a la Función:
108
Funciones de Valores de Tabla de Múltiples Instrucciones
CREATE FUNCTION [ owner_name. ] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )
RETURNS @return_variable TABLE < table_type_definition >
[ WITH < function_option > [ [,] ...n ] ]
[ AS ]
BEGIN
function_body
RETURN
END
109
Módulo 12: Programando a través de Múltiples
Servidores
Consultas Distribuidas
Las consultas distribuidas tienen acceso a datos de varios orígenes, que pueden
estar almacenados en un equipo o en equipos distintos. Microsoft SQL Server
2000 admite las consultas distribuidas a través de OLE DB
110
Configurar servidores vinculados
111
hay proveedores OLE DB para una amplia variedad de archivos y formatos de
archivos, incluidos archivos de texto, datos de hojas de cálculo y los resultados de
búsquedas de contenido de texto.
Vinculación de un Servidor
sp_addlinkedserver
Crea un servidor vinculado, que permite obtener acceso a consultas heterogéneas
distribuidas en orígenes de datos OLE DB. Tras crear un servidor vinculado con
sp_addlinkedserver, este servidor puede ejecutar consultas distribuidas. Si el
servidor vinculado se define como Microsoft SQL Server, se pueden ejecutar
procedimientos almacenados remotos.
En este ejemplo se crea un servidor vinculado denominado SVRTEC que utiliza el
Proveedor Microsoft OLE DB para SQL Server.
2. Para tener acceso a una base de datos de Access que no sea segura, los
inicios de sesión de SQL Server que intentan tener acceso a la base de
datos de Access deben definir una asignación de inicio de sesión para el
nombre de usuario Admin sin contraseña.
112
Para crear un servidor vinculado que obtenga acceso a una base de datos SQL
Server
2. Asigne cada inicio de sesión de SQL Server local que necesite tener acceso
al servidor vinculado a un inicio de sesión con Autenticación de SQL Server
del servidor vinculado.
En este ejemplo se asigna el acceso del inicio de sesión local Joe al inicio
de sesión con Autenticación de SQL Server Visitor en el servidor vinculado
llamado Lab06.
Para consultar la tabla de Cliente en la base de datos de Facturación:
SELECT *
FROM SVRTEC.Facturacion..Cliente
113
Transacciones Distribuidas
Sintaxis
Argumentos
transaction_name
Se trata de un nombre de transacción definida por el usuario que se utiliza para
realizar el seguimiento de la transacción distribuida en los programas de MS DTC.
El argumento transaction_name debe seguir las reglas de los identificadores, pero
sólo se utilizan los 32 primeros caracteres.
@tran_name_variable
Se trata del nombre de una variable definida por el usuario que contiene el nombre
de una transacción utilizada para realizar el seguimiento de la transacción
distribuida en las herramientas de MS DTC. La variable se debe declarar con un
tipo de datos char, varchar, nchar o nvarchar.
Observaciones
114
procedimiento almacenado en el ServidorC, y el procedimiento almacenado del
ServidorC ejecuta una consulta distribuida contra el ServidorD, los cuatro
servidores SQL están involucrados en la transacción distribuida. El ServidorA es
el que origina y controla la transacción.
Las conexiones involucradas en transacciones Transact-SQL distribuidas no
obtienen un objeto de transacción que puedan pasar a otra conexión para que se
dé de alta explícitamente en la transacción distribuida. La única forma en que un
servidor remoto puede darse de alta en la transacción consiste en que constituya
el destino de una llamada a un procedimiento almacenado remoto o a una
consulta distribuida.
Este ejemplo actualiza el nombre del producto en las bases de datos local y
remota. Ambas bases de datos, local y remota, confirmarán o desharán la
transacción.
USE Facturacion
GO
BEGIN DISTRIBUTED TRANSACTION
UPDATE Producto
SET NomProducto = 'Tornillos' WHERE ProductoPk = 3 and NegocioPk = 2
EXECUTE remote.Facturacion.dbo.spModNombreProd 2,3, ‘Tornillos’
COMMIT TRAN
GO
115
Crear una Vista Dividida
-- On Server2:
CREATE TABLE Customer_66
(CustomerID INTEGER PRIMARY KEY
CHECK (CustomerID BETWEEN 33000 AND 65999),
... -- Additional column definitions)
-- On Server3:
CREATE TABLE Customer_99
116
(CustomerID INTEGER PRIMARY KEY
CHECK (CustomerID BETWEEN 66000 AND 99999),
... -- Additional column definitions)
Después de crear las tablas miembro, defina una vista con particiones distribuida
en cada servidor miembro, con el mismo nombre para cada vista. Esto permite
que las consultas que hacen referencia al nombre de vista dividida distribuida se
ejecuten en los servidores miembro. El sistema funciona como si hubiera una
copia de la tabla original en cada servidor miembro, aunque cada servidor sólo
tiene una tabla miembro y una vista dividida distribuida. La aplicación detecta la
ubicación de los datos.
Puede generar las vistas divididas distribuidas, si:
• Crea una vista dividida distribuida en cada servidor miembro. Las vistas
utilizan las instrucciones SELECT distribuidas para obtener acceso a los
datos de los servidores miembro vinculados y mezclan las filas distribuidas
con las filas de la tabla miembro local.
117