Vous êtes sur la page 1sur 47

ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.

htm

7 ADMINISTRACIÓN AVANZADA
DE MS SQL SERVER 2000

USO DE ÍNDICES______________________________________________________ 246


¿QUÉ ES UN ÍNDICE?_________________________________________________ 246
CONCEPTOS DE INDEXACIÓN_________________________________________ 249
CREACIÓN DE ÍNDICES_______________________________________________ 254
USO DEL FACTOR DE RELLENO PARA EVITAR DIVISIONES DE PÁGINA___ 255
RECONSTRUCCIÓN DE LOS ÍNDICES___________________________________ 257
CONSEJOS SOBRE EL USO DE ÍNDICES_________________________________ 258
USO DE VISTAS_______________________________________________________ 259
¿QUÉ ES UNA VISTA?_________________________________________________ 259
CONCEPTOS DE VISTAS_______________________________________________ 259
CREACIÓN DE VISTAS________________________________________________ 261
MODIFICACIÓN Y ELIMINACIÓN DE VISTAS___________________________ 267
SEGURIDAD Y USUARIOS______________________________________________ 269
CREACIÓN Y ADMINISTRACIÓN DE INICIOS DE SESIÓN DE USUARIO____ 269
CREACIÓN DE USUARIOS DE SQL SERVER_____________________________ 276
ADMINISTRACIÓN DE PERMISOS DE BASES DE DATOS__________________ 277
ADMINISTRACIÓN DE FUNCIONES DE BASES DE DATOS_________________ 283
TRANSACCIONES Y BLOQUEOS________________________________________ 288
TRANSACCIONES____________________________________________________ 288
BLOQUEO DE TRANSACCIONES_______________________________________ 295

1 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

USO DE ÍNDICES
¿QUÉ ES UN ÍNDICE?
Los índices son una de las herramientas disponibles más potentes para el diseñador de bases
de datos. Un índice es una estructura auxiliar que permite mejorar el rendimiento de las consultas
mediante la reducción de la actividad de entrada/salida necesaria para recuperar los datos
solicitados, es decir, un índice permite a Microsoft SQL Server 2000 localizar los datos mediante el
uso de una menor cantidad de operaciones de entrada/salida que las que se necesitarían para buscar
los datos accediendo solamente a la tabla de la base de datos. Cuando se utiliza un índice de una
tabla de la base de datos para buscar una fila de datos, SQL Server puede determinar rápidamente
dónde se almacenan los datos y recuperarlos inmediatamente. Así, los índices de tabla de la base de
datos son muy parecidos a los índices de los libros (ambos proporcionan un acceso rápido a grandes
cantidades de información). En este capítulo se van a aprender los conceptos básicos de los índices,
incluyendo cómo crear un índice y los tipos de índices disponibles en SQL Server. También se va a
aprender cuándo utilizar los índices y cuándo no hay que utilizarlos, ya que el uso de los índices no
es útil siempre (en algunos casos pueden disminuir el rendimiento).

Como ya se ha mencionado, un índice es una estructura de datos auxiliar que usa SQL Server
para acceder a los datos. Dependiendo del tipo, un índice se almacena con los datos o separado de
ellos. Independientemente del tipo, todos los índices trabajan de la misma forma básica.

En los sistemas sin índices, todos las recuperaciones de datos se deben realizar mediante la
exploración de las tablas. En un recorrido de tabla, todos los datos de la tabla se deben leer y
comparar con los datos seleccionados. Los recorridos de tabla normalmente se deben evitar, debido
a la cantidad de operaciones de entrada/salida que se generan con esta operación (la exploración de
tablas grandes puede llevar gran cantidad de tiempo y consumir muchos recursos del sistema).
Mediante el uso de un índice, se puede reducir en gran medida el número de operaciones de
entrada/salida, acelerando el acceso a los datos, así como liberando recursos del sistema para otras

Un índice de la base de datos se organiza en una estructura de árbol B. Cada página de


Índice se denomina una página índice o un nodo índice. La estructura de índices comienza con un
nodo en el nivel superior. El nodo raíz marca el inicio del índice; es el primer dato al que se accede
cuando se produce una búsqueda de datos. El nodo raíz contiene una cantidad de filas índice. Estas
filas índice contienen un valor clave y un puntero a una página de índice (denominado nodo rama)
como se muestra en la figura siguiente. Esta configuración es necesaria debido a que en una tabla de
datos de tamaño medio, un índice consta de miles o millones de páginas índice. Comenzando por el
nodo raíz y atravesando los nodos rama, SQL Server puede acercarse a los dalos que se desean.

2 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

Usando como analogía un libro, un índice trabaja de forma parecida a lo siguiente: se supone
que el índice comienza en una página que lista los números de las páginas en donde las entradas
comienzan por «a», «b», «c», y así consecutivamente. Después se supone que estas páginas
contienen los números de páginas para las entradas en los rangos aa-ab, ac-ad, ae-af, etc., y esas
páginas contienen punteros a las entradas de los rangos aaa-aab, aac-aad, aae-aaf, y así
sucesivamente. Con esta ordenación, se puede encontrar lo que se está buscando rápidamente, con
relativamente pocas búsquedas. Esto es parecido a un índice de tabla de una base de datos, siendo la
primera página el nodo raíz.

Al igual que el nodo raíz, cada nodo rama contienen un número de filas índice guardadas en una
página índice. Cada fila índice apunta a otro nodo rama o a un nodo hoja, como se muestra en la
figura siguiente. Los nodos hoja forman el último nivel de un índice. A diferencia del nodo raíz, cada
nodo rama también tienen una lista enlazada a otros nodos rama del mismo nivel. En otras palabras,
los nodos conocen los nodos adyacentes, así como también conocen los nodos inferiores.

Como implica el nombre «árbol B», los nodos rama se expanden desde el nodo raíz en forma
de árbol. Cada grupo de nodos rama del mismo nivel de la estructura de árbol se conoce como un
nivel de índices, como se muestra en la figura siguiente. El número de operaciones de entrada/salida
que se necesitan para alcanzar los nodos hoja (los nodos del nivel más bajo del árbol) depende del
número de niveles de índices. Si la tabla de la base de datos sólo contiene una cantidad pequeña de
datos, el nodo raíz puede apuntar directamente a los nodos hoja, por lo que el índice no tiene que
contener ningún nodo rama (una situación improbable).

3 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

identificador de fila apuntando a la fila deseada de la tabla, o bien la clave de índice agrupado si
también existe un índice agrupado en la tabla. Y en un índice agrupado el mismo dato está en el
nodo hoja. El número de filas de un nodo hoja depende del tamaño de las entradas de índices y, en
el caso de un índice agrupado, del tamaño de los datos.

Nota: Un identificador de fila es un puntero que construye automáticamente SQL Server a partir del
identificador de archivo, el número de página y el número de la fila de datos. Con el identificador de la
fila, se pueden recuperar los datos con únicamente una operación de entrada/salida adicional. Debido a
que se conoce qué página hay que recuperar y SQL Server conoce dónde está esa página, la página se lee
en memoria con una única solicitud de entrada/salida La simplicidad de este proceso es la razón por la que
los índices son tan eficientes a la hora de recuperar los datos y de proporcionar tan gran mejora en el
rendimiento.

Hay que tener en cuenta que, debido a que el índice se crea ordenado, cualquier cambio de
los datos puede implicar una sobrecarga adicional. Por ejemplo, si una inserción implica la inserción
de una nueva fila índice en un nodo hoja que está lleno, SQL Server debe hacer sitio para la nueva
fila. Esto lo hace moviendo aproximadamente la mitad de las filas del nodo hoja a otra página. Este
movimiento de datos se denomina división de página. Una división de página en un nivel del árbol
puede implicar divisiones en cascada en el árbol. Las divisiones de página se pueden evitar mediante
un ajuste cuidadoso del factor de llenado.

CONCEPTOS DE INDEXACIÓN
Ahora que se tiene un conocimiento básico de la estructura de los índices, se van a repasar
algunos de los conceptos de INDEXACIÓN más generales. En esta sección se va a aprender acerca
de las claves de los índices, la unicidad de los índices y los tipos de índices.

Claves de los índices

Una clave de índice designa la columna o columnas que se utilizan para generar el índice. La
clave del índice es el valor que permite buscar rápidamente la fila que contiene los datos que se
están buscando, de igual forma a como una entrada del índice en un libro apunta a un tema concreto
del texto. Para acceder a la fila de datos usando un índice, se debe incluir el valor o valores de 1a
clave del índice en la cláusula WHERE de la instrucción SQL. Cómo se logra depende de sí el índice
es un índice simple o un índice compuesto.

Índices simples

Un índice simple es un índice que se define en una sola columna de la tabla. Se debe hacer
referencia a esta columna en la cláusula WHERE de la instrucción para que se use este índice para
cumplir la instrucción.

Un índice simple puede ser efectivo dependiendo del tipo de datos que se están ordenando,
del número de elementos únicos de la columna y del tipo de instrucciones SQL que se usen. En otros
casos se necesita un índice compuesto. Por ejemplo, si se está indexando una libreta de direcciones
con miles de nombres y direcciones, la columna state no es una buena candidata para un índice

4 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

Índices compuestos

Un índice compuesto es un índice que se define en más de una columna. Se puede acceder a
un índice compuesto usando una o más claves de índice. Con SQL Server 2000, un índice puede
abarcar hasta 16 columnas y sus columnas clave pueden ser de hasta 900 bytes.

Para las consultas que formen parte de un índice compuesto, no es necesario que se incluyan
todas las claves de índice en la cláusula WHERE de una instrucción SQL, pero es sensato utilizar
más de una de ellas. Por ejemplo, si se crea un índice en las columnas a, b y c de una tabla, se puede
acceder al índice usando una instrucción SELECT que contenga (a AND b AND c) o (a AND b) o
a. Por supuesto, el uso de una cláusula WHERE más restrictiva, como la que contiene a AND b
AND c, proporciona un mejor rendimiento. Recuperará menos filas de la base de datos ya que
identifica una fila más específicamente. Si se usa a AND b o solamente a, sólo se iniciará un
recorrido del índice.

Un recorrido de índice ocurre debido a que más de una entrada de índice satisface la
búsqueda. En un recorrido de índice, los nodos de un índice se exploran para recuperar vanos
registros de datos. Además, el índice incluye parcialmente el valor que se ha seleccionado. Por
ejemplo si el índice se ha creado para las columnas a, b y c, y la consulta solamente especifica la
columna a, se devolverán todas las filas que satisfagan ese valor de a, para todos los valores de b y
c.

Debido a que las columnas en que se basa un índice están ordenadas numéricamente, el
optimizador de consultas de SQL Server puede determinar el rango de páginas índices que pueden
contener los datos deseados. Una vez que se conocen las páginas de comienzo y fin, se recuperan
todas las páginas que contienen los valores de datos y se exploran los datos demandados.

Nota: El índice solamente se puede utilizar si al menos una de las claves del índice están en la cláusula
WHERE de la consulta SQL. Continuando con el ejemplo anterior, una consulta con solamente un nombre o
un número de teléfono en la cláusula WHERE no usa el índice. En la mayoría de los casos un recorrido de
índice puede ser bastante eficiente; sin embargo, si se accede a más del 20 por ciento de las filas de la
tabla, es más eficiente un recorrido de tabla, en la cual se leen todas las filas de la tabla. La eficiencia de
las consultas que usan un índice depende de cómo su utilice el índice y en la unicidad del índice.

Unicidad de los índices

En SQL Server se puede definir un índice como único o no único. En un índice único, cada
valor de la clave del índice debe ser único. Un índice no único permite que las claves del índice
estén duplicadas en los datos de la tabla. La efectividad, o eficiencia, de un índice no único depende
de la selectividad del índice.

Índices únicos

Un índice único contiene solamente una fila de datos por cada clave del índice (en otras
palabras, los valores de la clave del índice no pueden aparecer en el índice más de una vez). Los
índices únicos trabajan bien debido a que garantizan que solamente se necesita una operación de
entrada/salida más para recuperar los datos solicitados. SQL Server obliga a que se cumpla la

5 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

una restricción PRIMARY KEY o una restricción UNIQUE en la tabla.

Un índice se puede hacer único solamente si los datos son únicos. Si los datos de la columna
no contienen valores únicos, todavía se puede crear un índice único usando un índice compuesto.
Por ejemplo, la columna last name podría no ser única, pero combinando los datos de esta columna
con las columnas first name y middle name, se podría crear un índice único en la tabla.

Nota: Si se intenta insertar una fila en una tabla que cree un valor duplicado de la clave de índice de un
índice único, la inserción fallará.

Índices no únicos

Un índice no único trabaja de la misma forma que un índice único, salvo que puede contener
valores duplicados en los nodos hoja. Todos los valores duplicados se recuperan si cumplen los
criterios especificados en la instrucción SELECT.

Un índice no único no es tan eficiente como un índice único debido a que necesita
procesamiento adicional (operaciones adicionales de entrada/salida) para recuperar los datos
requeridos. Pero debido a que algunas aplicaciones necesitan utilizar claves duplicadas, algunas
veces es imposible crear un índice único. En estos casos, un índice no único frecuentemente es
mejor que no tener ningún índice.

Tipos de índices

Hay dos tipos de índices de árbol B: índices agrupados e índices no agrupados. Un índice
agrupado almacena las filas de datos reales en sus nodos hoja. Un índice no agrupado es una
estructura auxiliar que apunta a los datos en una tabla. En esta sección, se verán las diferencias
entre estos dos tipos de índices.

Índices agrupados

Como se ha mencionado, un índice agrupado es un índice de árbol B que almacena los datos
de la fila actual de la tabla en sus nodos hoja, de forma ordenada, como se muestra en la figura
siguiente. Este sistema ofrece algunas ventajas y algunas desventajas.

Debido a que los datos de un índice agrupado se almacenan en los nodos hoja, una vez llegan
al nodo hoja, los datos están disponibles, lo que puede resultar en un número menor de operaciones
de entrada/salida. Cualquier reducción de estas operaciones produce un mayor rendimiento, para las
operaciones individuales y un mejor rendimiento medio para el sistema.

6 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

orden del índice. Por ejemplo, si se crea un índice agrupado a partir de las columnas state, country,
y city y una consulta que selecciona todos los valores para los que state es Texas, la salida resultante
está ordenada según country y city en el orden en que se haya definido en el índice. Esta
característica se puede utilizar para evitar operaciones innecesarias de ordenación si la base de datos
y la aplicación se han diseñado cuidadosamente. Por ejemplo, si se sabe que siempre va a ser
necesario ordenar los datos de un cierta forma, el uso de un índice agrupado significa que no se va a
tener que realizar la ordenación una vez se hayan recuperado los datos.

Una desventaja del uso de un índice agrupado es que el acceso a la tabla siempre es a través
del índice, lo que puede provocar una sobrecarga adicional. SQL Server comienza el acceso a los
datos en el nodo raíz y atraviesa el índice hasta que llega al nodo hoja que contiene los datos. Si se
crean muchos nodos hoja debido al volumen de datos, el número de niveles de índices necesarios
para soportar esta cantidad de nodos hoja también es grande, lo que se necesitan son más
operaciones de entrada/salida para que SQL Server vaya desde el nodo raíz hasta el nodo hoja.

Debido a que los datos reales se almacenan en el índice agrupado, no se puede crear más de
un índice agrupado en una tabla. Por otra parte, se pueden crear índices no agrupados sobre una
tabla agrupada (una tabla agrupada es sencillamente una tabla que tiene un índice agrupado). El
índice agrupado se debería crear usando las claves de índices a las que se accede más
frecuentemente (esto proporciona una mayor probabilidad de acceder a los datos a través del índice
agrupado y por ello se mejora el rendimiento.)

Índices no agrupados

A diferencia de los índices agrupados, los índices no agrupados no contienen los datos reales
de la tabla en sus nodos hoja. Los nodos hoja pueden contener uno o dos tipos de información de
ubicación de filas de datos. En primer lugar, si no hay índices agrupados en la tabla, los índices no
agrupados de esa tabla almacenan los identificadores de filas en sus nodos hoja, como se puede ver
en la figura siguiente. Cada identificador de fila apunta a la fila de datos real de la tabla. El
identificador de fila está formado por un valor que incluye el ID del archivo de datos, el número de
página y la fila de la página. Este valor permite un acceso rápido a los datos reales señalando
exactamente dónde están almacenados los datos.

Si existe un índice agrupado en la tabla, los índices no agrupados contendrán en los nodos

7 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

Cuando se alcanza el nodo hoja del índice no agrupado, se usa el valor de la clave agrupada
encontrada en el nodo para buscar en el índice agrupado, donde se encontrará en su nodo hoja la fila
de datos.

Como ya se ha mencionado, solamente se puede tener un índice agrupado por tabla. Se


pueden crear 249 índices no agrupados por tabla, pero esto no es deseable. Es frecuente tener varios
índices no agrupados en varias columnas de la tabla. El predicado de la cláusula WHERE lo usa el
optimizador de consultas para determinar qué índice se utiliza.

CREACIÓN DE ÍNDICES
La creación de índices no es difícil. Se pueden crear índices agrupados o no agrupados casi
del mismo modo usando los asistentes que suministra el Administrador corporativo o mediante el
comando CREATE INDEX de SQL. En esta sección, se mostrará cómo crear índices y se mostrará
el uso del factor de relleno.

Con el uso de Transact-SQL (T-SQL) para la creación de un índice, se puede hacer una
secuencia de comandos y ejecutarlo una y otra vez. También se puede modificar la secuencia de
comandos de creación de índices para realizar otros índices. Además, este método de creación de
índices ofrece mayor flexibilidad debido a que hay más parámetros disponibles. Para utilizar esta
técnica, simplemente se escriben los comandos T-SQL en un archivo y se lee este en el OSQL
usando la mayor sintaxis:

Osql -U nombre_de_usuario -P contraseña create_index.sql

Este comando asume que el archivo creado se denomina create_index.sql. También se puede
ejecutar la secuencia de comandos usando el Analizador de consultas. Para crear un índice usando
T-SQL se debe utilizar el comando CREATE INDEX. La sintaxis de este comando CREATE
INDEX se muestra a continuación:

CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]


INDEX nombre_del_índice ON nombre_de_la_tabla
(
nombre_de_columna [,nombre_de_columna ,nombre_de_columna ,...]
)

8 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

como no único, como agrupado o no agrupado, con una o más columnas y con los parámetros
opcionales que se listan en la siguiente tabla. También se puede especificar, opcionalmente, un
grupo de archivos en el que emplazar el índice.

Parámetro Descripción

PAD_INDEX Cuando se usa junto con el parámetro FILL_FACTOR, indica qué espacio se debe
dejar en los nodos rama, en vez de dejarlo en los nodos hoja.

FILL_FACTOR ?número Especifica cómo de lleno se va a hacer cada nodo hoja; porcentaje desde
0 a 100.
IGNORE_DUP_KEY Especifica que se ignorará una inserción en un índice único con valores
duplicados y se emitirá un mensaje de aviso. Si no se especifica IGNO-
RE_DUP_KEY KEY la inserción entera se deshará.

DROP_EXISTING Especifica que los índices existentes con el mismo nombre se deben eliminar y
volver a crear el índice. Este parámetro mejora el rendimiento cuando se vuelve a
crear un índice agrupado en una tabla que tiene índices no agrupados porque no se
requieren pasos separados para eliminar y volver a crear los índices no agrupados.

STATISTICS_NORECOMPUTE Especifica que los datos estadísticos no deben ser recalculados. Esta opción no se
recomienda porque sus planes de ejecución se basan en datos que probablemente no
serán óptimos. Se usa este parámetro sólo si se planea actualizar estadísticas
manualmente.

El uso de secuencias de comandos T-SQL es preferible al uso del Asistente para creación de
índices. A pesar que el T-SQL es inicialmente más difícil de utilizar, con el paso del tiempo, se
encontrará que es más fácil la creación de múltiples índices si se usa T-SQL.

USO DEL FACTOR DE RELLENO PARA EVITAR DIVISIONES DE


PÁGINA

Cuando se hacen actualizaciones o inserciones en una tabla que contiene índices también se
tienen que actualizar las páginas de índices. Las páginas de índices se unen unas con otras mediante
punteros que van desde una página a otra. Hay dos punteros, uno a la siguiente página y otro a la
página anterior. Cuando una página de índices está completa, una actualización del índice provocará
un cambio en la cadena de punteros porque se tiene que insertar una nueva página de punteros entre
dos páginas (en un proceso que se conoce como división de páginas de índices) para que se pueda
escribir la nueva información en el sitio correcto de la cadena de índices. SQL Server mueve
aproximadamente la mitad de las filas de la página existente (donde se han de incluir los nuevos
datos a esta nueva página de índices. Las dos páginas que originalmente se apuntaban una a la otra
apuntan a la nueva página y la nueva página apunta a ambas (hacia delante y hacia atrás),

9 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

Cuando esto ocurra, se tendrá que encontrar espacio adicional para las nuevas páginas de índices.
Para crear más espacio, SQL Server continúa realizando divisiones de página de índice, dando como
resultado un incremento en la sobrecarga del sistema debido a un uso adicional de CPU y de
operaciones de entrada/salida adicionales. Esto también produce índices fragmentados. Los datos
del índice se dispersan por la base de datos, causando un rendimiento menor.

Una manera de reducir la división y fragmentación de la página se realiza configurando el


factor de relleno de los nodos del índice. El factor de relleno especifica el porcentaje de los nodos
que se ha de rellenar cuando se crea el índice, así se permite dejar espacio para las filas de índice
adicionales. Se puede especificar el factor de relleno de un índice usando la opción FILL_FACTOR
de la instrucción T-SQL CREATE INDEX, como se describió anteriormente. Si no se especifica un
factor de relleno en el comando CREATE INDEX, se usará el que tenga predeterminado el sistema.
El valor predeterminado se sitúa en el valor que tenga el parámetro factor de relleno de
sp_configure. Este valor se establece en 0 cuando se instala SQL Server.

Nota: El parámetro de factor de relleno sólo afecta al modo en que se crea un índice; su cambio no tendrá
efecto una vez se ha construido el índice.

El rango de valor del factor de relleno se sitúa entre 0 y 100, que indica el porcentaje de la
página de índice que se rellena. Un valor de 0 es un caso especial. Cuando se especifica 0, los nodos
hoja se rellenan completamente, pero los nodos rama y el nodo raíz dejan espacio libre. Este valor es
el predeterminado en la instalación de SQL Server y normalmente funciona bien.

Un factor de relleno de 100 especifica que todos los nodos del índice sean completamente
rellenados cuando se crea el índice. Este valor es óptimo para los índices de las tablas que nunca van
a recibir nuevos datos y que no son actualizadas. Ambos, los nodos hoja y los superiores del índice,
se rellenan completamente y cualquier inserción causará una división de página. Las tablas de sólo
lectura son ideales para esta configuración; aunque se borren datos no se causarán divisiones de
página.

Un valor bajo del factor de relleno dejará mucho espacio para las inserciones pero requiere
una gran cantidad de espacio para crear el índice. A menos que se realicen inserciones constantes en
la base de datos, la configuración del factor de relleno con un valor bajo no es normalmente
aconsejable. Si se producen muchas divisiones de página, se puede solucionar reduciendo el valor
del factor de relleno y reconstruyendo el índice para ver si se produce un menor número de
divisiones.

Se puede conocer el número de divisiones de página por segundo que se producen en el


sistema usando el contador Page Splits/Sec del Monitor de rendimiento. Este contador se encuentra
en el objeto SQL Server:Access Methods.

Si con el tiempo se producen divisiones de página y el índice se fragmenta muchas veces, la


solución sería la reconstrucción del índice. La fragmentación ocurre aunque se use un factor de
relleno que deje espacio en la página índice. Con el tiempo, ese espacio también se rellenará.

RECONSTRUCCIÓN DE LOS ÍNDICES

10 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

realizar una consulta particular de la mejor manera posible. Las estadísticas de los índices se
actualizan de forma predeterminada periodicamente. Sin embargo, los índices se fragmentan algunas
veces cuando pasa un largo periodo de tiempo debido a las divisiones de páginas, que dispersan
fisicamente el índice por la base de datos. Como resultado el rendimiento empeora. Un índice
también puede llegar a estar desequilibrado, esto es, una porción del árbol tiene más páginas del
índice rellenas que otra. Se puede restablecer el equilibrio y la continuidad reconstruyendo el índice.
También se vuelven a crear las estádisticas del índice cuando se reconstruye este.

Otro problema es cuando el índice tiene mas niveles de los necesarios. A mayor número de
niveles menor es el rendimiento ya que se deben realizar más operaciones de entrada/salida. Al
reconstruir el índice también se reducen el número de niveles, y con ello, el número de operaciones
de entrada/salida necesarias para las busquedas en el índice.

Los dos métodos para reconstruir un índice sin tener que borrarlo y volver a crearlo, se
realizan mediante CREATE INDEX ... DROP_EXISTING y DBCC DBREINDEX.

CREATE INDEX ... DROP_EXISTING se usa para reconstruir sólo un índice cada vez en la
tabla.

DBCC DBREINDEX se usa con el nombre de una base de datos y el nombre de un tabla
para reconstruir todos los índices de esa tabla, sin tener que ejecutar comandos separados para cada
índice.

Si no se tiene tiempo o recursos para reconstruir los índices es posible actualizar las
estadísticas de los índices de forma independiente. Aunque esta técnica no es tan eficiente como la
reconstrucción de índice, porque aunque actualicemos las estadísticas el índice puede continuar
fragmentado, es mejor que tener unas estadísticas anticuadas si se ha desactivado la opción de
actualización automática de las estadísticas.

UPDATE STATISTICS nombre_de_la_tabla


[ nombre_del_indice | [nombre_de_estadística [, nombre_estadistica, ...]]
[ WITH
[ FULLSCAN || SAMPLE número {PERCENT | ROWS]
[ ALL | COLUMNS | INDEX]
[ NORECOMPUTE]
]

nombre_de_indice Especifica el índice al que se han de calcular las estadísticas. De forma


predeterminada, si no se especifica se recalculan las estadísticas de todos lo
índices de la tabla.

nombre_de_estadística Si no se especifica se recalculan todas las estadísticas.

FULLSCAN Especifica que se han de leer todas las filas de la tabla para recalcular las
estadísticas. Es la mejor manera de recalcular estadísticas pero también la más
costosa.

SAMPLE numero ... Especifica el número o porcentaje de columnas en las que se basan las
estadísticas. No se puede utilizar con la opción FULLSCAN.

ALL |COLUMNS|INDEX Especifica si se recalculan todas las estadísticas, solo las de las columnas o solo

11 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

CONSEJOS SOBRE EL USO DE ÍNDICES


q Si una consulta accede a más del 20% de las filas de una tabla, un recorrido de tabla es más
efectivo que usar un índice.

q Se debe tratar que los índice tengan la mayor selectividad posible (es decir el número de filas
obtenido por cada valor del clave del índice). A mayor selectividad del índice mayor
probabilidad de que sea usado por el optimizador de consultas.

q Se deben usar los índices con moderación, es decir, unos pocos índices pueden ser útiles pero
demasiados índices pueden afectar negativamente al rendimiento porque hay que mantenerlos
actualizados cada vez que se realizan operación de insercción, actualización y borrado en los
datos.

q No poner índices en tablas pequeñas.

q Utilizar el menor número posible de columnas en el índice (índices estrechos), ya que estos
ocupan menos espacio y necesitan menos sobrecarga de mantenimiento.

12 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

USO DE VISTAS
¿QUÉ ES UNA VISTA?
Una vista es una tabla virtual que está definida por una consulta que consiste en una
instrucción SELECT. Esta tabla virtual está creada con datos de una o más tablas reales y, para los
usuarios, una vista parece una tabla real. De hecho, una vista puede ser tratada del mismo modo que
una tabla normal. Los usuarios pueden hacer referencia a estas tablas virtuales con instrucciones
Transact-SQL (T-SQL) del mismo modo que se hace con las tablas. En una vista se pueden realizar
las operaciones SELECT, INSERT UPDATE y DELETE.

En realidad, una vista se almacena simplemente como una instrucción SQL previamente
definida. Cuando se accede a la vista, el optimizador de consultas de SQL Server une la instrucción
SQL que se ejecuta en ese momento con la consulta que se use para definir la vista.

La ventaja de utilizar vistas es que se pueden crear vistas que tienen atributos diferentes sin
tener que duplicar los datos. Las vistas son útiles en un gran número de situaciones. Como se verá
más adelante en este capítulo, se pueden utilizar para la seguridad de los datos, para facilitar la
presentación de los datos y para realizar una presentación lógica de los datos. También se pueden
utilizar para unir datos divididos.

CONCEPTOS DE VISTAS
Ahora que se tiene un concepto básico de lo que es una vista, se analizará con mayor
profundidad. En esta sección se explicarán los tipos de vistas, las ventajas de usar vistas y las
restricciones que tiene SQL Server en el uso de una vista.

Tipos de vistas

Se pueden crear varios tipos de vistas, cada uno de los cuales tienen ventajas en ciertas
situaciones. El tipo de vista que se ha de crear depende completamente de para qué se quiera usar la
vista. Se pueden crear vistas de cualquiera de las siguientes maneras:

· Subconjunto de columnas de una tabla: Una vista puede consistir en una o más columnas de
una tabla. Probablemente es el tipo de vista más común y se puede utilizar para simplificar los
datos o para seguridad.

· Subconjunto de filas de una tabla: Una vista puede contener todas las filas que se deseen. Este
tipo de vista también es útil para la seguridad.

· Unión de dos o más tablas: Se puede crear una vista usando una operación de unión. Las
operaciones de unión complejas se pueden simplificar cuando se usa una vista.

· Información de agregación: Se puede crear una vista que contenga datos de agregación. Este

13 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

posteriormente, se pueden usar las vistas para unir estas tablas en una gran tabla virtual que facilite
el acceso a la misma.

Ventajas de las vistas

Una ventaja del uso de las vistas es que éstas siempre ofrecen los datos actualizados. La
instrucción SELECT que define una vista sólo se ejecuta cuando se accede a la vista, por tanto,
todos los cambios de la tabla subyacente se reflejan en la vista.

Otra ventaja de usar vistas es que una vista puede tener un nivel diferente de seguridad del
que posea la tabla subyacente. La consulta que define la vista se ejecuta con el nivel de seguridad
que posea el usuario que crea la vista. De esta manera, se puede crear una vista que enmascare los
datos que no se quieran mostrar a ciertas clases de usuarios.

Restricciones de las vistas

SQL Server asigna una serie de restricciones en la creación y el uso de las vistas. Estas
restricciones incluyen las siguientes:

· Limitación de columnas: Una vista puede hacer referencia hasta a 1024 columnas de una
tabla. Si se necesita hacer referencia a un número mayor de columnas, se tendrán que usar otros
métodos.

· Limitación de la base de datos: Solamente se puede crear una vista de una tabla en la base de
datos a la que el creador de la vista está accediendo.

· Limitación de seguridad: El creador de la vista debe tener acceso a todas las columnas a las
que se haga referencia en la vista.

· Reglas de integridad de los datos: Cualquier actualización, modificación, etc., que se haga en
la vista, no puede romper las reglas de integridad de los datos. Por ejemplo, si la tabla
subyacente de la vista no admite los valores nulos, la vista tampoco los admitirá.

· Limitación de niveles en las vistas anidadas: Las vistas se pueden crear sobre otras vistas (en
otras palabras, se puede crear una vista que acceda a otras vistas). Las vistas se pueden anidar
hasta 32 niveles.

· Limitación de la orden SELECT: La orden SELECT de una vista no puede contener una
cláusula ORDER BY ni la palabra clave INTO.

CREACIÓN DE VISTAS
Las vistas, al igual que los índices, se pueden crear de muchas maneras. Se puede crear una
vista usando la orden CREATE VIEW de T-SQL. Este método es preferible si hay posibilidades de
que se creen más vistas en el futuro, porque se pueden almacenar las órdenes T-SQL en un archivo

14 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

Uso de T-SQL para crear una vista

Crear vistas usando el T-SQL es al proceso más rápido: se ejecuta CREATE VIEW para
crear una vista usando ISQL, OSQL o el Analizador de consultas de SQL Server. Como se
mencionó, es preferible utilizar los comandos T-SQL en un texto porque los comandos pueden ser
modificados y reutilizados (también se deben guardar las definiciones de la base de datos en texto
para cuando se tenga que volver a crear la base de datos).

El comando CREATE VIEW tiene la siguiente sintaxis:

CREATE VIEW nombre_de_la_vista [ ( columna, columna, ... ) ]


[WITH ENCRYPTION]
AS
instrucción SELECT
[WITH CHECK OPTION]

Cuando se crea una vista se pueden activar dos opciones para cambiar el comportamiento de
la vista. Se activan estas opciones incluyendo las palabras claves opcionales WITH ENCRYPTION
o WITH CHECK OPTION, o ambas, en la instrucción T-SQL. Seguidamente se verán estas
opciones con más detalle.

La palabra clave WITH ENCRYPTION especifica que la definición de la vista (la


instrucción SELECT que define la vista) sea cifrada. SQL Server usa el mismo método para cifrar
las instrucciones SQL que para las contraseñas. Esta técnica de seguridad puede ser útil si no se
quiere que ciertas clases de usuarios sepan a qué tablas se está accediendo.

La palabra clave WITH CHECK OPTION especifica que las operaciones de modificación de
datos que se realizan en una vista deben seguir el criterio contenido en la instrucción SELECT que
define la vista. Por ejemplo, no estaría permitida una operación de modificación de datos realizada
en una vista para crear una fila de la tabla que no sea visible dentro de la tabla. Supongamos que se
define una vista para seleccionar información sobre todos los empleados del departamento de
finanzas. Si no se incluye WITH CHECK OPTION, se puede modificar el valor de la columna
department de finanzas a un valor que indique otro departamento. Si se especifica esta palabra
clave, esta modificación no estaría permitida porque la alteración del valor de una fila department
haría que esta fila no volviese a ser accesible desde la vista. La palabra clave WITH CHECK
OPTION especifica que no se puede hacer inaccesible una fila desde la vista haciendo un cambio
dentro de ésta.

La instrucción SELECT se puede modificar para crear cualquier vista que se quiera. Se
puede utilizar para seleccionar un subconjunto de columnas, un subconjunto de filas o para realizar
una operación de unión. En las siguientes secciones se aprenderá cómo usar el T-SQL para crear
varios tipos de vistas.

Subconjunto de columnas

Una vista consistente en un subconjunto de columnas puede ser útil cuando se necesita
proveer de seguridad una tabla que debería ser sólo parcialmente accesible para los usuarios. Ahora

15 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

llamada Employee que contiene las columnas de datos que se muestran en la figura siguiente.

La mayoría de estos datos son críticos y deberían ser vistos sólo por ciertos empleados. Sería
útil, sin embargo, permitir a todos los empleados ver parte de los datos. Si se crea una vista que
permita a todos los empleados acceder sólo a ciertos datos solucionará está cuestión. También se
puede utilizar la vista para impedir que haya datos duplicados en otras tablas de bases de datos.

Para crear una vista de la tabla Employee que solamente permita el acceso a las columnas
name, phone y office se usa la siguiente instrucción T-SQL:

CREATE VIEW emp_vw


AS
SELECT name, phone, office
FROM Employee

La vista resultante contendrá las columnas que se muestran en la figura siguiente. Aunque
estas columnas también existen en la tabla subyacente, los usuarios que usen esta vista para acceder
a los datos podrán ver las columnas sólo en la vista. Debido a que una vista puede tener un nivel de
seguridad distinto al de la tabla subyacente, la vista puede permitir el acceso a cualquier persona
mientras que la tabla permanece segura. En otras palabras, se puede restringir el acceso a la tabla
Employee sólo al departamento de recursos humanos, por ejemplo, mientras se permite a todos los
empleados que usen la vista.

Subconjunto de filas

Se puede utilizar una vista que consista en un subconjunto de filas para restringir el acceso
limitando las vistas disponibles para los usuarios. Supongamos que la tabla Employee está llena de
datos, como se muestra en la figura siguiente. En este ejemplo, en vez de limitar las columnas, se
restringen las filas especificándolas en una cláusula WHERE, como se muestra aquí:

CREATE VIEW emp_vw2


AS
SELECT *

16 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

departamento de recursos humanos o departamento 1, como se muestra en la figura siguiente.

Esta vista puede ser útil cuando los empleados del departamento de recursos humanos deban
acceder a las fichas de los empleados de su área. A una vista subconjunto_de_filas, al igual que la
vista subconjunto_de_columnas, se le puede asignar un nivel de seguridad diferente al de la tabla o
tablas subyacentes.

Combinaciones

Mediante la definición de uniones en una vista, se puede simplificar las instrucciones T-SQL
que se usan para acceder a los datos cuando las instrucciones contengan una instrucción JOIN.
Ahora se verá un ejemplo. Supongamos que tenemos dos tablas, Manager y Employee2.

La siguiente instrucción combina las tablas Employee2 y Manager en una única tabla virtual:

CREATE VIEW org_chart


AS
SELECT Employee2.ename, Manager.mname
FROM Employee2,Manager
WHERE Employee2.manager_id =Manager.id
GROUP BY Manager.mname,Employee2.ename

En este ejemplo, las dos tablas se combinan en el valor manager_id. Los datos resultantes,
que se incluyen en la vista org_chart, se agrupan por el nombre del director, como se muestra en la
figura siguiente. Nótese que sí un director está en la tabla Manager, pero ningún empleado de los
que están en la tabla Employee2 trabaja para ese director, no aparecerá ninguna entrada para ese
director en la vista. Tampoco habrá entradas en la vista para un empleado que esté listado en la tabla
Employee2 pero que no tenga a su jefe correspondiente en la tabla Manager Para los usuarios, lo

17 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

Agregación

Las vistas de agregación pueden ser útiles de muchas maneras, tales como para recuperación
de porcentajes y sumas de departamentos. Por ejemplo, para propósitos presupuestarios, se puede
usar una vista de agregado para ver la cantidad de dinero que cada departamento de la corporación
paga en salarios. También se puede llevar a cabo esta tarea usando una pregunta T-SQL. La ventaja
de usar una vista es que los usuarios pueden ejecutarla sin tener que conocer el modo de usar las
funciones de agregación y las preguntas T-SQL.

Nota: Las funciones de agregación de SQL Server realizan cálculos de un conjunto de valores y devuelven
un único valor. Las funciones de agregación incluyen AVG, COUNT MAX MIN y SUM.

La siguiente instrucción establece una vista que usa una función (SUM) en la tabla
Employee:

CREATE VIEW sal_vw


AS
SELECT dept, SUM(salary)
FROM Employee
GROUP BY dept

En este ejemplo la vista establece una tabla virtual que muestra el total que cada
departamento paga en salarios. Los datos resultantes se agrupan por departamentos. Esta vista de

18 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

División

Las vistas se usan comúnmente para mezclar datos divididos en una única tabla virtual. La
división se usa para reducir el tamaño de las tablas e índices. Para dividir los datos, se crean
múltiples tablas que reemplazan una única y se le asigna a cada nueva tabla un rango de valores de
la tabla original. Por ejemplo, en vez de tener una gran tabla como base de datos que guarde los
datos de las transacciones de ventas de la compañía, se pueden crear muchas tablas pequeñas, cada
una de las cuales contiene los valores de una semana y después usar una vista para combinarlas y
ver el historial de transacciones. Las distintas tablas pequeñas y sus índices son más manejables que
lo que podría ser una gran base de datos y su índice. Más aún, se pueden eliminar datos viejos de
una manera más sencilla borrando una tabla subyacente de datos obsoletos. Ahora se verá este
concepto en mayor detalle.

La vista que se muestra en la figura siguiente parece una gran tabla para los usuarios, pero
por debajo hay muchas tablas, cada una con su propio índice.

Como ya se ha mencionado, la división crea un sistema mucho más manejable para DBA y la
unión de datos divididos simplifican los datos para los usuarios.

Para crear una vista que consolide los datos divididos o una vista dividida, primero se deben
crear las tablas divididas. Estas tablas contendrán la mayor parte de los datos de ventas. Cada tabla
guardará los datos de un periodo en particular, normalmente una semana o un mes. Una vez se han
creado estas tablas, se puede usar una instrucción UNION ALL para crear una vista que contenga
todos los datos. Por ejemplo, supongamos que se tienen cuatro tablas llamadas table_1, table_2,
table_3 y table_4. La siguiente instrucción crea una gran tabla virtual que incluye todos los datos de
estas tablas:

CREATE VIEW partview


AS
SELECT * FROM table_1
UNION ALL
SELECT * FROM table_2
UNION ALL
SELECT * FROM table_3
UNION ALL
SELECT * FROM table_4

19 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

MODIFICACIÓN Y ELIMINACIÓN DE VISTAS

Se utiliza el comando ALTER VIEW para modificar las vistas mediante T-SQL. Este
comando es similar el comando CREATE VIEW y tiene la siguiente sintaxis:

ALTER VIEW nombre_de_la_vista [(columna, columna, ...)]


[WITH ENCRYPTION]
AS
su instrucción SELECT
[WITH CHECK OPTION]

La única diferencia entre los comandos ALTER VIEW y CREATE VIEW es que el segundo
comando falla si la vista ya existe, mientras que el comando ALTER VIEW falla si la vista
nombrada no existe. (Las palabras clave opcionales WITH ENCRYPTION y WITH CHECK
OPTION tienen el mismo significado que en la creación de la vista). Para ver cómo funciona el
comando ALTER VIEW, se volverá a usar el ejemplo la división. Para eliminar una división vieja y
añadir una nueva se puede modificar la vista como sigue:

ALTER VIEW partview


AS
SELECT * FROM table_2
UNION ALL
SELECT * FROM table_3
UNION ALL
SELECT * FROM table_4
UNION ALL
SELECT * FROM table_5

La vista modificada será similar a la que se hizo con el comando ALTER VIEW, pero ahora se
selecciona un conjunto de datos diferentes. La vista ya no usará table_1, sino que ahora utilizará
table_5.

Para eliminar una vista se usa el comando DROP VIEW. La sintaxis de este comando, que es
muy simple, se muestra a continuación:

DROP VIEW nombre_de_la_vista

20 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

SEGURIDAD Y USUARIOS
En este apartado se aprenderá a administrar usuarios y seguridad en un entorno Microsoft
SQL Server 2000. Una de las tareas más corrientes de un administrador de bases de datos, además
de la planificación de la recuperación y las copias de seguridad, volumen y administración de
espacio, es la administración de la seguridad. Es también una de las tareas más importantes que un
administrador de bases de datos tiene que realizar. Si se viola la seguridad del sistema, los datos se
pueden perder o corromper. En este apartado se aprenderá a crear y administrar sesiones de inicio
de usuario, así como los modos de autenticación; además se aprenderá sobre los ID de usuario de
SQL Server. Una sesión de inicio de usuario se usa para autenticar el acceso a SQL Server. La
sesión de inicio de usuario puede autenticarse por medio de Microsoft Windows NT o Microsoft
Windows 2000 o por medio de SQL Server. Un ID de usuario se usa para asignar permisos a
usuarios para acceder a objetos específicos dentro de las bases de datos individuales. Los ID de
usuario están asociados a los inicios de sesión de usuarios y podrían o no tener el mismo nombre,
como verá más tarde en este apartado. Se aprenderá también sobre los tipos de permisos que se
pueden asignar en SQL Server y cómo se usan. Y también se aprenderá a usar funciones para
administrar con más facilidad a los usuarios.

CREACIÓN Y ADMINISTRACIÓN DE INICIOS DE SESIÓN DE USUARIO


Comienza el examen y administración de usuarios considerando los inicios de sesión de
usuario. En esta sección se tratará primero por qué son importantes los inicios de sesión, así como
los métodos de autenticación que se pueden usar para mantener los inicios de sesión. Es posible
crear inicios de sesión mediante tres métodos: mediante el Administrador corporativo de SQL
Server, mediante Transact-SQL (T-SQL) y mediante el uso del Asistente para creación de inicio de
sesión.

¿Por que crear inicios de sesión de usuario?

Los inicios de sesión de usuarios permiten proteger los datos contra modificaciones no
autoriza sean intencionadas o no. Gracias a los inicios de sesión de usuario, SQL Server permite
identificar usuarios individuales autorizados. Cada inicio de sesión de usuario tiene asignado un
nombre único y una contraseña. Cada usuario tiene asignado su propia cuenta de inicio de sesión.
Sin los inicios de sesión de usuario, todas las conexiones a SQL Server usarían el mismo
identificador, lo que imposibilitaría crear diferentes niveles de seguridad basados en quién accede a
la base de datos.

Con los inicios de sesión de usuario, puede crear varios niveles de seguridad permitiendo
permisos diferentes a diferentes cuentas de inicio de sesión con el fin de acceder a objetos y realizar
funciones.

Y gracias a los in sesión de usuario, se puede permitir solamente a algunos usuarios insertar y
actualizar información en ciertas tablas de la base de datos, y conceder accesos de sólo lectura a las

21 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

de teléfono, número de oficina, nivel académico, salario, bonos, etc. Para evitar que ciertos usuarios
accedan a información confidencial en la tabla, se debería crear primero una vista que contuviera
solamente información no sensible, tal como los nombres de los empleados, números de teléfono y
números de oficina.

Después, implementando inicios de sesión de usuario, se puede restringir el acceso a la tabla


subyacente mientras se permite a todos los usuarios acceder a la vista. Sin embargo, si no se
aprovecharan las posibilidades de los inicios de sesión de usuario, cualquier usuario podría acceder a
la vista o a la tabla, perdiendo así el uso de la vista su intencionalidad.

Modos de autenticación

Para acceder a SQL Server se dispone de dos modos de autenticación: Autenticación con
Windows de Microsoft y Autenticación en modo mixto. En Autenticación con Windows, el sistema
operativo es el responsable de identificar al usuario. SQL Server usa después esta identificación del
sistema operativo para determinar los permisos de usuario que hay que aplicar. Con Autenticación
en modo mixto, los dos Windows NT/2000 y SQL Server son responsables de identificar al usuario.
Para acceder a SQL Server, hay siempre que acceder primero mediante un inicio de sesión a una
cuenta Windows NT/2000, de forma que cuando se selecciona un modo de autenticación, hay que
decidir simplemente si se quiere utilizar la Autenticación SQL Server además de la Autenticación de
Windows. Se va a tratar con más detalle cada uno de estos modos de autenticación. Se aprenderá
cómo implementar estos modos más adelante en esta sección.

Autenticación de Windows

Según se ha indicado, con Autenticación de Windows, SQL Server se basa en Windows


NT/2000 para proporcionar seguridad al inicio de sesión. Cuando un usuario inicia su sesión con
Windows NT/2000, se comprueba la identificación de la cuenta de usuario. SQL Server comprueba
que el usuario fue validado por Windows NT/2000 y permite el acceso basado en esa identificación.

SQL Server integra su proceso de seguridad en el inicio de sesión con el de Windows para
proporcionar estos servicios. Los atributos de seguridad en la red se validan por medio de un
sofisticado proceso de cifrado proporcionado por Windows NT/2000.

Debido a que los procesos de seguridad en el inicio de sesión de SQL Server y Windows se
integran cuando se utiliza este modo, una vez que se es identificado por el sistema operativo, no es
necesario utilizar ningún otro método de identificación al acceder a SQL Server. La única
contraseña que hay que suministrar en el inicio de sesión con SQL Server es la contraseña de
Windows NT/2000.

La Autenticación de Windows se considera un método mejor que la Autenticación en modo


mixto debido a las características de seguridad adicionales que proporciona. Estas características
comprenden la validación y cifrado de forma segura de las contraseñas, auditorías, caducidad de
contraseñas, longitud mínima de la contraseña, y bloqueo automático de la cuenta tras un
determinado número de intentos fallidos en el inicio de sesión.

22 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

En la Autenticación en modo mixto, los usuarios pueden acceder a SQL Server utilizando la
Autenticación de Windows o la Autenticación de SQL Server. Al usar la Autenticación en modo
mixto, si se produce una conexión desde un sistema inseguro, SQL Server identifica el inicio de
sesión comprobando si la cuenta de inicio de sesión se ha configurado con el acceso solicitado por el
usuario. SQL Server realiza la identificación de la cuenta comparando el nombre del código y
contraseña que el usuario proporciona al conectarse a SQL Server con la información de la cuenta
almacenada en la base de datos. Si la cuenta para el inicio de sesión no ha sido configurada por el
usuario o si el usuario no proporciona el nombre correcto y su contraseña, se rechaza el acceso a
SQL Server.

El modo de Autenticación de Windows no está disponible cuando se ejecuta SQL Server en


Windows 95/98, de manera que hay que usar la Autenticación de SQL Server (usando la
Autenticación en modo mixto) en tales plataformas. Además, las aplicaciones Web requieren la
Autenticación de SQL Server (a través de Microsoft Internet Information Server) porque los
usuarios de estas aplicaciones no estarán probablemente dentro del mismo dominio que el servidor y
por tanto no pueden trabajar basados en los mecanismos de seguridad de Windows. Otras
aplicaciones que necesitan acceso a base de datos podrían requerir igualmente la autenticación de
SQL Server: algunos desarrolladores de aplicaciones prefieren usar la seguridad de SQL Server para
sus aplicaciones porque simplifica la seguridad de las mismas. Cuando las aplicaciones utilizan la
seguridad de SQL Server (dentro de una red de confianza), los desarrolladores de aplicaciones no
tienen que proporcionar autenticación de seguridad dentro de la propia aplicación, lo que simplifica
el trabajo.

Configuración del modo de autenticación

En la configuración del modo de autenticación se siguen estos pasos:

1. Abrir la ventana del Administrador corporativo. En el panel izquierdo, pulsar con el botón
secundario el nombre del servidor que contiene la base de datos para la que se desea establecer
el modo de autenticación y seleccionar Propiedades del menú emergente para mostrar la ventana
de SQL Server. Pulsar en la ficha Seguridad, como aparece en la figura siguiente.

23 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

2. En esta ficha se puede seleccionar tanto el método de seguridad como la cuenta de inicio del
servicio. En el área de Seguridad, se especifica si debería usar Autenticación SQL Server y
Windows NT/2000 (Modo mixto) o si se debería usar sólo Autenticación Windows NT/2000.
También se puede especificar el nivel de auditoría del inicio de sesión. Esta configuración
determina qué tipo, en caso de existir, que auditoría de inicio de sesión se realiza. El nivel de
auditoría seleccionado dependerá de los requisitos de seguridad. Hay cuatro niveles disponibles
que son los siguientes:

- Ninguno: No realiza ninguna auditoría de inicio de sesión. Es la configuración predeterminada.


- Correcto: Registra todos los intentos válidos de inicios de sesión.
- Error: Registra todos los intentos fallidos de inicio de sesión.
- Todos: Registra todos los intentos de inicio de sesión.

Nota: El nivel de auditoría es una propiedad de la base de datos. De esta manera, se aplica el mismo nivel
de auditoría a todos los inicios de sesión.

3. En el área de la cuenta de inicio de servicio, hay que especificar la cuenta de Windows que se
debería usar al iniciar y ejecutar SQL Server. Se puede usar la cuenta del sistema o especificar
una cuenta, por ejemplo la de Administrador, con su contraseña. Pulsar en Aceptar para
confirmar la configuración establecida.

Inicios de sesión y usuarios

En las dos secciones siguientes se aprenderá cómo crear sesiones de inicio de sesión y

24 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

la base de datos. También podría ser necesaria la Autenticación de SQL Server. Tanto si se va a usar
Autenticación Windows o Autenticación en modo mixto, la cuenta que se usa para la conexión a
SQL Server se conoce como inicio de sesión de SQL Server.

Además del inicio de sesión a SQL Server, cada base de datos tiene un conjunto de cuentas
ficticias asignadas a ella. Estas pseudocuentas proporcionan alias a cuentas de inicio de sesión de
SQL Server.

Por ejemplo, en la base de datos Northwind, podría haber un usuario llamado administrador
que se asocia con el inicio de sesión invitado, y la base de datos pubs podía tener un usuario
llamado administrador que se asocia con la cuenta de SQL Server de inicio de sesión sa.

En forma predeterminada, una cuenta de inicio de sesión de SQL Server no tiene un Id. De
usuario de base de datos asociado con ella; por tanto, carece de permisos.

Creación de inicios de sesión de SQL Server

Se pueden realizar la mayoría de las tareas administrativas utilizando una de los diversos
métodos, y la tarea de crear los inicios de sesión de usuarios no es una excepción. Según se
mencionó anteriormente, se puede crear un inicio de sesión de una de las tres formas: mediante uso
del Administrador Corporativo, mediante T-SQL, o usando el Asistente de creación de inicios de
sesión.

Utilización del Administrador corporativo para la creación de inicios de sesión de SQL Server

Para crear los inicios de sesión de SQL Server utilizando el Administrador corporativo, se
siguen estos pasos:

1. En el panel izquierdo de la ventana del Administrador corporativo, expandir el grupo servidor,


expandir el servidor, y luego expandir la carpeta Seguridad.
Pulsar con el botón secundario en Inicios de sesión, y seleccionar Nuevo inicio de sesión del
menú contextual para mostrar la ventana de Propiedades de inicio de sesión de SQL Server, que
se presenta a continuación.
En la ficha General, introducir un nombre de inicio de sesión en el cuadro de texto Nombre. Si
se usa Autenticación de Windows, el nombre debe ser un nombre de cuenta válido en
Windows. A continuación se especifica el dominio de Windows en el cuadro de texto Dominio.
En el área Predeterminado, especificar la base de datos y el idioma predeterminado para este
inicio de sesión. En el área Autenticación hay que especificar si se usará una cuenta de
Autenticación de Windows o de Autenticación de SQL Server. Si se selecciona Autenticación
de SQL Server, se usará el Modo de autenticación mixto.

25 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

2. Pulsar con el botón la ficha Funciones del servidor, que se presenta en la figura siguiente. En
esta ficha se puede especificar qué funciones del servidor se utilizan, seleccionando estas
funciones de la lista de funciones disponibles al usuario. Pulsando Propiedades se puede ver y
modificar la función seleccionada. Las funciones se explican en la sección «Funciones de
administración de bases de datos» más adelante en este capítulo.)

3. Pulsar la ficha Acceso a base de datos, que aparece en la figura siguiente. Esta ficha permite
especificar qué bases de datos tiene permiso el usuario para acceder. (Los permisos de las bases
de datos se cubren en la sección «Administración de permisos de bases de datos» más adelante
en este capítulo.) Se pueden seleccionar varias bases de datos y las funciones que están
disponibles a esas bases de datos. Pulsar Propiedades permite ver y administrar las propiedades
de las funciones de la base de datos.

26 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

4. Al finalizar las opciones de especificación, hay que guardar el inicio de sesión pulsando Aceptar.
Para ver listado el nuevo inicio de sesión junto a los demás inicios de sesión hay que pulsar la
carpeta Inicios de sesión en el Administrador corporativo. Los inicios de sesión aparecen listados
en el panel derecho.

CREACIÓN DE USUARIOS DE SQL SERVER

Se pueden crear usuarios de SQL Server utilizando el Administrador corporativo o T-SQL.


(SQL Server no incluye ningún asistente de ayuda a este proceso). Hay que recordar que un usuario
de SQL Server se define para una base de datos particular y los permisos se asignan a esa base de
datos para un inicio de sesión de usuario específico. El Id. de usuario de SQL Server puede tener
una misión análoga a la del inicio de sesión de SQL Server, pero no necesita tener el mismo nombre
que el inicio de sesión.

Nota: para crear un usuario SOL Server, tiene que haber definido un inicio de sesión de SQL
Server para ese usuario porque el nombre de usuario constituye una referencia a un inicio de
sesión de SQL Server.

Uso del Administrador corporativo en la creación de usuarios

A diferencia de los inicios de sesión de SQL Server, que son creados dentro de la carpeta
Seguridad del Administrador corporativo, los usuarios de SQL Server se crean a partir de una
carpeta de base de datos específica en el panel izquierdo del Administrador corporativo. Para crear
usuarios que utilicen el Administrador corporativo, se siguen estos pasos:

1 Pulsar el botón secundario la base de datos en la que se va a crear al usuario, apuntar a


Nuevo en el menú contextual, y luego seleccionar Usuario de base de datos para mostrar la
ventana Propiedades del usuario de la base de datos, que aparece en la figura siguiente.
Introducir un nombre válido de inicio de sesión de SQL Server en la lista desplegable

27 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

este capítulo, asignando permisos a estas funciones, se pueden aplicar los permisos al
usuario.

2. Pulsar Propiedades para mostrar la ventana Propiedades de la función de la base de datos.


En esta ventana se puede modificar una función de la base de datos que se haya
seleccionado.

3. Cuando se finalice con las opciones de configuración hay que pulsar Aceptar dos veces
para crear el usuario de la base de datos.

ADMINISTRACIÓN DE PERMISOS DE BASES DE DATOS


Los permisos se utilizan para controlar el acceso los objetos de bases de datos y para
especificar qué usuarios pueden realizar ciertas acciones en las bases de datos. Se pueden establecer
tanto permisos del servidor como de la base de datos. Los permisos de servidor permiten al
administrador de la base de datos realizar las tareas de administración de la base de datos. Los
permisos de base de datos se usan para permitir o denegar el acceso a objetos de base de datos y a
instrucciones. En esta sección se tratarán todos los tipos de permisos y cómo asignarlos.

Permisos de servidor

Como ya se mencionó anteriormente, los permisos de servidor se asignan a los


administradores de la base de datos para permitirles desarrollar tareas administrativas. Los permisos
se definen de acuerdo a determinadas funciones del servidor. Los inicios de sesión de usuario

28 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

ser modificados ni concedidos a usuarios individuales.

Permisos de objetos de base de datos

Los permisos de objetos de base de datos son una a clase de permisos que se conceden para
permitir el acceso a objetos de base de datos. Los permisos de objetos son necesarios para acceder a
una tabla o vista utilizando instrucciones SQL tales como SELECT, INSERT UPDATE y DELETE.

Un permiso de objeto también se necesita para usar la instrucción EXECUTE para la


ejecución de un procedimiento almacenado. Se puede utilizar el Administrador corporativo o los
comandos T-SQL para asignar permisos a objetos.

Utilización del Administrador corporativo para asignar permisos de objetos

Para usar el Administrador corporativo para conceder permisos a objetos de base de datos a
un usuario, se siguen los pasos siguientes:

1. Expandir un grupo servidor, expandir la base de datos a la que se desea asignar permisos y
pulsar la carpeta Usuarios. Los usuarios aparecen listados entonces en el panel derecho. Pulsar
con el botón secundario un nombre de usuario y seleccionar propiedades del menú emergente
para mostrar la ventana Propiedades del usuario de la base de datos, que aparece en la figura
siguiente.

2. Pulsar el botón Permisos para mostrar la ventana Propiedades del usuario de la base de datos,
que aparece en la figura siguiente. (Para mostrar esta ficha, también se puede pulsar con el botón
secundario el nombre del usuario, apuntar a Todas las tareas en el menú emergente y luego
seleccionar Administrar permisos.) En esta ficha se administran los permisos asignados al
usuario. Para asignar permisos al usuario para acceder a objetos dentro de la base de datos, se
seleccionan las casillas de comprobación en las columnas SELECT, INSERT, UPDATE,

29 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

superior de la ventana para enumerar todos los objetos o sólo los objetos que tienen permiso de
acceso para este usuario.

Utilización de T-SQL para asignar permisos de objeto

Para usar T-SQL en la asignación de permisos de objeto a un usuario, se ejecuta la


instrucción GRANT. La instrucción GRANT tiene la sintaxis siguiente:

GRANT {ALL | permisos }


[ columna ON { tabla | vista} ]
[ ON tabla (columna) ] |
[ ON vista (columna) ] |
[ ON procedimiento_almacenado | procedimiento_extendido ]
TO cuenta_de_seguridad
[ WITH GRANT OPTION ]
[ AS { grupo | función } ]

El parámetro cuenta_de_seguridad tiene que tener el tipo de cuenta siguiente:

· Usuario SQL Server.


· Función SQL Server.
· Usuario Windows.
· Grupo Windows.

La utilización de la palabra clave GRANT OPTION permite al usuario o usuarios


especificados en la instrucción conceder el permiso especificado a otros usuarios. Esto puede ser útil
cuando se conceden permisos a otros administradores de la base de datos. Sin embargo, la opción
GRANT se deberá usar con cuidado.

La opción AS especifica cuál es la autoridad con la que se ejecuta la instrucción GRANT.

30 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

GRANT SELECT, INSERT, UPDATE


ON Customers
TO MaríaW
WITH GRANT OPTION
AS Accounting

La opción AS Accounting se usa porque la función Accounting tiene derecho a conceder


permisos en la tabla Customers. La palabra clave GRANT OPTION permite a MaríaW conceder
permisos a otros usuarios.

Más información: Para ver una lista de los permisos que se pueden especificar en la instrucción GRANT
búsquese «GRANT descrita(GRANT)» en el índice de Libros en pantalla.

Uso de T-SQL para revocar permisos de objeto

Se puede usar el comando REVOKE de T-SQL para revocar los permisos de objeto a un
usuario.

La instrucción REVOKE tiene la sintaxis siguiente:

REVOKE [ GRANT OPTION FOR ]


{ ALL [ PRIVILEGES ] | permisos }
[ columna ON { tabla | vista } ] |
[ ON tabla (columna) ] |
[ ON vista (columna) ] |
[ ON { procedimíento_almacenado | procedimiento_extendido } ]
{ TO | FROM } cuenta_de_seguridad
[ CASCADE ]
[ AS { grupo | función }

El parámetro cuenta_de_seguridad tiene que pertenecer a uno de los tipos siguientes:

· Usuario SQL Server.


· Función SQL Server.
· Usuario Windows.
· Grupo Windows.

La opción GRANT OPTION FOR permite revocar permisos que se concedieron con
anterioridad usando la palabra clave GRANT OPTION, así como revocar permisos. La opción AS
especifica con qué autoridad se ejecuta la instrucción REVOKE.

Un ejemplo de uso de la instrucción REVOKE es el siguiente:

REVOKE ALL
ON Customers
FROM MaríaW

La instrucción REVOKE ALL elimina todos los permisos que el usuario tiene en la tabla

31 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

Permisos de instrucción de base de datos

Además de asignar permisos de objeto de base de datos, se pueden asignar permisos de


instrucción. Los permisos de objeto capacitan a los usuarios para acceder a los objetos dentro de la
base de datos, mientras que los permisos de instrucción les autorizan a crear objetos de base de
datos, inclusive bases de datos y tablas. Los permisos de instrucción se listan a continuación:

· BACKUP DATABASE: Permite al usuario ejecutar el comando BACKUP DATABASE.

· BACKUP LOG: Permite al usuario ejecutar el comando BACKUP LOG.

· CREATE DATABASE: Permite al usuario crear nuevas bases de datos.

· CREATE DEFAULT: Permite al usuario crear valores predeterminados que pueden ser
vinculados a las columnas.

· CREATE PROCEDURE: Permite al usuario crear procedimientos almacenados.

· CREATE RULE: Permite al usuario crear funciones.

· CREATE TABLE: Permite al usuario crear nuevas tablas.

· CREATE VIEW: Permite al usuario crear nuevas vistas. Se pueden asignar permisos de
instrucción por medio del Administrador corporativo o por T-SQL.

Utilización del Administrador corporativo para asignar permisos de instrucción

El uso del Administrador corporativo para conceder permisos de instrucción a un usuario


requiere los pasos siguientes:

1. Expandir un grupo servidor, expandir un servidor y luego expandir la carpeta Base de


datos. Pulsar con el botón secundario el nombre de la base de datos a la que se desea asignar
permisos y seleccionar Propiedades del menú emergente para mostrar la ventana
Propiedades de la base de datos.

2. Pulsar la ficha permisos como se muestra en la figura siguiente. Aquí se pueden asignar
permisos de instrucción a los usuarios y funciones que tengan acceso a la base de datos. Las
columnas que contienen casillas de comprobación definen los permisos de instrucción que se
pueden asignar y la columna Usuario o Función lista los usuarios y las funciones que tienen
acceso a esta base de datos.

32 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

Utilización de T-SQL para asignar permisos de instrucciones

Para asignar permisos de instrucción a un usuario utilizando T-SQL, se usa la instrucción


GRANT. La instrucción GRANT tiene la sintaxis siguiente:

GRANT { ALL | instrucción }


TO cuenta_de_seguridad

Los permisos de instrucción que se pueden asignar a un usuario son CREATE DATABASE,
CREATE DEFAULT, CREATE PROCEDURE, CREATE RULE, CREATE TABLE, CREATE
VIEW, DROP TABLE, DROP VIEW, BACKUP DATABASE y BACKUP LOG, según se dijo
anteriormente. Por ejemplo, para agregar los permisos de instrucción CREATE DATABASE y
CREATE TABLE a la cuenta de usuario JackR, se usa el comando siguiente:

GRANT CREATE DATABASE, CREATE TABLE


TO 'JackR’

Como se puede ver, agregar permisos de instrucción a una cuenta de usuario no es un


proceso nada complicado.

Utilización de T-SQL para revocar permisos de instrucción

Puede usar la instrucción T-SQL, REVOKE para eliminar permisos de instrucción de una
cuenta de usuario. La instrucción REVOKE tiene la sintaxis siguiente:
REVOKE { ALL | instrucción }
FROM cuenta_de_seguridad

Por ejemplo, para eliminar sólo el permiso de instrucción CREATE DATABASE de la

33 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

Como se puede ver, eliminar permisos de instrucción de una cuenta de usuario no es un


proceso nada complicado.

ADMINISTRACIÓN DE FUNCIONES DE BASES DE DATOS


Se puede simplificar la tarea de administrar muchos permisos a muchos usuarios usando las
funciones de base de datos. Las funciones de base de datos se diseñan para permitir a grupos de
usuarios recibir los mismos permisos de base de datos sin tener que recibir los permisos
individualmente. En lugar de asignar permisos individuales a usuarios individuales, se puede crear
una función que represente los permisos utilizados por un grupo de usuarios y después asignarlos al
grupo.

Normalmente, las funciones se configuran para grupos de trabajo particulares, clases de


trabajo, o tareas de trabajo. De esta manera, los nuevos usuarios se pueden hacer miembros de una o
más funciones de base de datos basadas en los trabajos que se irán a realizar. Por ejemplo, se
podrían definir funciones para clase de trabajos tales como cuentas de pago, cuentas de recibos,
ingeniería y recursos humanos. Cuando un usuario se une a uno de estos departamentos o grupos, se
le asigna simplemente como un miembro de la función creada para ese grupo. Un usuario puede ser
miembro de una o más funciones, pero el usuario no necesita ser miembro de ninguna de las
funciones. Además para ser asignado miembro de una función de base de datos, el usuario tiene que
tener asignados permisos individuales.

Creación y modificación de funciones

Se cumple con la tarea de crear y modificar funciones de base de datos usando las mismas
herramientas que se usan para realizar la mayoría de las tareas relacionadas con la administración de
base de datos:

Administrador corporativo o comandos T-SQL. (SQL Server no proporciona asistente para


estas tareas.) Cualquiera que sea el método que use, se deben realizar las tareas siguientes al
implementar una función:

· Crear una función de base de datos.


· Asignar permisos a la función.
· Asignar usuarios a la función

Al ver una función se podrán ver tanto los permisos asignados a la función como los usuarios
asignados a la función.

Utilización del Administrador corporativo para administrar funciones

Para crear funciones de base de datos con el Administrador corporativo, se siguen los pasos
siguientes:

34 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

Función de base de datos. Como alternativa, se puede expandir la base de datos, pulsar
Funciones con el botón secundario y seleccionar Nueva función de base de datos del menú
contextual. En cualquier caso, aparece la ventana Propiedades de la función de la base de datos,
según se muestra en la figura siguiente.

2. Asignar un nombre descriptivo a la función introduciendo el nombre en el cuadro de texto


Nombre -seleccionar un nombre que ayude a recordar el papel de la función. La figura anterior
muestra el nombre Cuentas de pago seleccionado para la función.

3. Para asignar usuarios a la función, pulsar Agregar. Aparece una lista de cuentas de usuario que
tienen acceso a la base de datos. Seleccionar los usuarios que se desee asignar a esta función.
Para cancelar una selección, se pulsa otra vez sin más el nombre del usuario apropiado. Al
finalizar la modificación de los miembros de la función, se pulsa Aceptar y se crea la función. Se
vuelve a la ventana del Administrador corporativo.

4. Para asignar permisos a la función, primero hay que abrir la ventana Propiedades de la función
de la base de datos expandiendo la carpeta Funciones, pulsar con el botón secundario el nombre

35 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

En esta ventana se pueden asignar varios permisos a esta función de los objetos dentro de la
base de datos que contiene la función. Para ello, se seleccionan las casillas de comprobación en el
cuadro de lista. Los objetos de la base de datos se listan en la columna Objeto. Se pueden usar los
botones de opciones en la parte superior de la ventana para ver todos los objetos o sólo aquellos
para los cuales ya tiene permisos la función. Una vez que asigna la función a un usuario, éste
recibirá todos los permisos que tiene asignados la función.

Una vez que se crea una función, se puede modificar en la ventana Propiedades de la función
de la base de datos. Para modificar una función, se siguen los pasos utilizados para agregar permisos
a una función. Puede agregar y eliminar usuarios y permisos en la ventana Propiedades de la función
de la base de datos.

Uso de funciones fijas de servidor

Cierto número de funciones predefinidas que se aplican en torno al servidor se crean en el


momento de la instalación de SQL Server en el servidor. Estas funciones fijas del servidor se usan
para conceder permisos a los administradores de la base de datos y pueden contener tanto permisos
de servidor como permisos de objeto y de instrucción.

Las funciones se listan a continuación:

· Bulkadmin: Puede realizar inserciones masivas.


· Dbcreator: Puede crear y alterar bases de datos.
· Diskadmin: Puede administrar archivos en disco.
· Processadmin: Puede administrar procesos de SQL Server.
· Securityadmin: Puede administrar inicios de sesión y crear permisos de base de datos.
· Serveradmin: Puede establecer cualquier opción del servidor y puede cerrar la base de datos.
· Setupadmin: Puede administrar servidores enlazados y arrancar procedimientos.
· Sysadmin: Puede realizar actividades del servidor.

Mediante la asignación de cuentas de usuario a funciones fijas del servidor, capacita a los
usuarios para realizar las tareas administrativas para aquellas funciones que tienen permiso
concedido. Dependiendo de las necesidades, podría ser preferible que todos los administradores de
la base de datos tuvieran la misma cuenta administrativa. Al igual que las funciones de base de
datos, las funciones fijas de servidor son mucho más fáciles de mantener que los permisos
individuales, pero las funciones fijas de servidor no se pueden modificar. Se puede asignar un
usuario a una función fija de servidor siguiendo los pasos que se listan en la página siguiente.

1. En el Administrador corporativo, expandir grupo servidor, expandir un servidor, expandir la


carpeta Seguridad y luego pulsar Funciones del servidor. Pulsar con el botón secundario la
función fija del servidor que desea agregar al usuario y seleccionar Propiedades del menú
contextual. Lo que invoca la ventana Propiedades de la función del servidor.

2. Para agregar una cuenta de usuario a la función, se pulsa primero Agregar. Lo que invoca el
cuadro de diálogo Agregar miembros, en la que se seleccionan nuevos miembros de la función.

36 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

TRANSACCIONES Y BLOQUEOS
Este apartado explica los fundamentos de las transacciones y del bloqueo de transacciones.
En este apartado se aprenderá lo que es una transacción, las propiedades que Microsoft SQL Server
2000 exige para considerar válida una transacción, la manera en que se utilizan los modos de
transacciones para especificar el comienzo y el final de una transacción y el modo de confirmar y
deshacer una transacción. También se examinarán los tipos y modos de bloqueos que utiliza SQL
Server al realizar transacciones y los conceptos de bloqueo e interbloqueo.

TRANSACCIONES
Una transacción es una serie de operaciones que se realizan como una unidad lógica de
trabajo. Las transacciones permiten a SQL Server asegurar un cierto nivel de integridad y de
recuperabilidad de los datos. El registro de transacciones, que debe tener toda base de datos,
guarda un registro de todas las transacciones que realizan cualquier tipo de modificación (inserción,
actualización o eliminación) en la base de datos. SQL Server utiliza este registro de transacciones
para recuperar los datos en caso de que se produzcan errores o fallos del sistema.

La integridad de una transacción depende en parte del programador de SQL. El programador


debe saber el momento en que debe iniciar y finalizar la transacción y el orden en que debe llevar a
cabo las modificaciones de los datos para asegurarse de la consistencia lógica y del significado de los
datos. Se estudiará la manera de comenzar y concluir las transacciones en apartados posteriores.
Una vez que se sabe lo que es una transacción se examinarán las propiedades que se exigen a una
transacción para considerarla válida.

PROPIEDADES ACID

Una transacción debe reunir cuatro requisitos para poder considerarla válida. Estos requisitos
se conocen como propiedades ACID. «ACID» es un acrónimo de atomicidad, consistencia,
aislamiento (isolation) y durabilidad. SQL Server ofrece mecanismos para ayudar a asegurar que una
transacción cumpla todos estos requisitos.

Atomicidad

SQL Server asegura que todas las modificaciones de datos de una transacción se completen
como un grupo si la transacción tiene éxito o que no se lleve a cabo ninguna de ellas si no lo tiene -
en otras palabras, SQL Server asegura la atomicidad de las transacciones. La transacción debe
llevarse a cabo como si fuera una unidad atómica - de ahí el término «atomicidad». Para que una
transacción tenga éxito, cada paso (o instrucción) de la transacción debe tener éxito. Si uno de los
pasos falla, falla toda la transacción y cualquier modificación efectuada desde su comienzo se
deshace. SQL Server proporciona un mecanismo de administración de transacciones que lleva a
cabo de manera automática la tarea de determinar si una transacción ha tenido éxito o ha fracasado

37 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

Consistencia

SQL Server también asegura la consistencia de las transacciones. Consistencia significa que
todos los datos permanecen en un estado consistente -que la integridad de los datos queda
preservada - una vez finalizada una transacción, independientemente de sí la transacción ha
fracasado o se ha completado con éxito. Antes de que comience una transacción la base de datos
debe hallarse en un estado consistente, lo que significa que se conserva la integridad de los datos y
que las estructuras internas, como los índices de los árboles B y las listas doblemente enlazadas, son
correctas. Y una vez haya tenido lugar una transacción, la base de datos debe hallarse en un estado
consistente - un estado nuevo si la transacción ha tenido éxito o, si la transacción ha fracasado, el
mismo estado consistente en el que se hallaba antes de que se iniciase la transacción.

La consistencia también es una característica de la administración de transacciones ofrecida


por SQL Server. Si los datos son consistentes y las transacciones mantienen la consistencia lógica y
la integridad de los datos, SQL Server asegura la consistencia de los datos después de una
transacción.

Aislamiento

Aislamiento significa que los efectos de cada transacción son iguales que si esa transacción
fuera la única del sistema; en otras palabras, las modificaciones realizadas por una transacción están
aisladas de las realizadas por cualquier otra transacción concurrente. De esta manera, una
transacción no se verá afectada por un valor que haya sido modificado por otra transacción hasta
que el cambio se confirme. Si una transacción fracasa, sus modificaciones no tienen ningún efecto,
ya que los cambios se deshacen. SQL Server permite ajustar el nivel de aislamiento de las
transacciones. El comportamiento de aislamiento de una transacción depende del nivel de
aislamiento especificado.

Nota: Cuando se confirma una transacción todas sus modificaciones se convierten en parte permanente de
la base de datos. Cuando una transacción se deshace los cambios se anulan y la base de datos funciona
como si la transacción nunca hubiera tenido lugar

Durabilidad

La última propiedad ACID es la durabilidad. Durabilidad significa que, una vez confirmada
una transacción, sus efectos son permanentes en la base de datos, incluso en caso de fallo del
sistema. El registro de transacciones de SQL Server y las copias de seguridad de la base de datos
proporcionan la durabilidad. Si SQL Server, el sistema operativo, o un componente del servidor
fallan, la base de datos se recuperará de manera automática cuando SQL Server se reinicie. SQL Ser
utiliza el registro de transacciones para repetir las transacciones confirmadas que fueron afectadas
por la caída del sistema y para deshacer las transacciones no confirmadas.

Si falla una unidad de disco y se pierden o se deterioran los datos se puede recuperar la base
de datos mediante las copias de seguridad de la base de datos y del registro de transacciones. Si se

38 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

concluirlas.

MODOS DE TRANSACCIONES

Las transacciones pueden comenzar en tres modos diferentes: confirmación automática,


explícita o implícita. El modo predeterminado de SQL Server es confirmación automática. Se
examinará el significado de cada uno de estos modos.

Modo de confirmación automática

En el modo de confirmación automática cada instrucción T-SQL se confirma cuando


concluye; con este modo no hacen falta instrucciones adicionales para controlar las transacciones.

En otros términos, cada transacción consiste en una única instrucción de T-SQL. El modo de
confirmación automática resulta útil cuando se ejecutan instrucciones mediante la línea de
comandos interactiva, mediante OSQL o el Analizador de consultas de SQL Server, ya que no hay
que preocuparse de iniciar y concluir explícitamente cada transacción. Se sabe que cada instrucción
será tratada por SQL Server como una transacción en sí misma y se confirmará en cuanto concluya.
Cada conexión a SQL Server utilizará el modo de confirmación automática hasta que se comience
una transacción explícita utilizando BEGIN TRANSACTION o hasta que se especifique el modo
implícito. Una vez concluida la transacción explícita o desactivado el modo implícito, SQL Server
volverá al modo de confirmación automática.

Modo de transacciones explícitas

El modo de transacciones explícitas es el utilizado con más frecuencia al programar


aplicaciones y en los procedimientos almacenados, los desencadenadores y las secuencias de
comandos. Cuando se ejecuta un grupo de instrucciones para llevar a cabo una tarea puede que haga
falta determinar los puntos en que debería iniciarse y concluir la transacción de modo que todo el
grupo de instrucciones tenga éxito o se deshaga. Cuando se identifica de manera explícita el
comienzo y el final de una transacción se utiliza el modo de transacciones explícitas y la transacción
se denomina transacción explícita. Una transacción explícita se especifica utilizando instrucciones
T-SQL o funciones API.

El uso de transacciones explícito cuando la tarea consta de varios pasos, también resulta
beneficioso porque, aunque no se especifiquen instrucciones ROLLBACK, SQL Server deshace de
manera automática las transacciones cuando se produzca un error grave, como una interrupción de
las comunicaciones en la red, la caída de un sistema de bases de datos o de cliente o un
interbloqueo. La instrucción T-SQL empleada para comenzar una transacción es BEGIN
TRANSACTION. Se especifica el final de la transacción mediante COMMIT TRANSACTION o
ROLLBACK TRANSACTION. De modo opcional se puede especificar un nombre para la
transacción en la instrucción BEGIN TRANSACTION, y hacer referencia a ella por su nombre en
las instrucciones COMMIT TRANSACTION o ROLLBACK TRANSACTION. La sintaxis de estas
tres instrucciones es la siguiente:

39 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

@nombre_variable_transacción |
nombre_punto_de_almacenamiento |
@nombre_variable_punto_de_almacenamiento ]

Como ya se ha indicado, una transacción confirmada es una en la que todas las


modificaciones realizadas por la transacción se transforman en parte permanente de la base de
datos. Antes de poder confirmar una transacción se escriben en el registro de transacciones de la
base de datos un registro de sus modificaciones y un registro de confirmaciones. Por tanto, las
modificaciones que forman parte permanente de la base de datos pueden hallarse en dos ubicaciones
posibles: o se escriben realmente en el disco y, por tanto, se hallan literalmente en la base de datos, o
en la caché de datos y el registro de transacciones puede rehacerla en caso de fallo para que la
transacción no se pierda.

Todos los recursos empleados por una transacción, como los bloqueos, se liberan en cuanto
la transacción se confirma. Una transacción se confirma con éxito si cada una de sus instrucciones
tiene éxito. A continuación se ofrece una pequeña transacción explícita denominada update_state,
que actualiza el valor de la columna state a XX en la tabla publishers para que todos los editores
que tengan el valor NULL en esa columna:

USE pubs
GO
BEGIN TRAN update_state,
UPDATE publishers SET state = 'XX’
WHERE state IS NULL
COMMIT TRAN update_state
GO

Si se ejecuta esta transacción se verá que hay dos columnas afectadas. Para devolver la tabla
a su estado original (como si hubiera tenido lugar una cancelación en lugar de la confirmación) hay
que ejecutar la transacción siguiente:

USE pubs
GO
BEGIN TRAN undo_update_state
UPDATE publishers SET state = NULL
WHERE state = 'XX’
COMMIT TRAN undo_update_state
GO

Una vez más, se debe ver que quedan afectadas dos filas. SQL Server ignora los nombres de
transacción update_state y undo_update_state empleados con COMMIT TRAN -los nombres de las
transacciones sólo sirven de ayuda al programador para identificar la transacción que se confirma.
SQL Server confirma de manera automática la última transacción sin confirmar que haya
comenzado antes de la confirmación, independientemente de sí se ha especificado un nombre para
la transacción.

Creación de transacciones anidadas

SQL Server permite transacciones anidadas, o transacciones situadas dentro de otras

40 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

instrucción COMMIT por cada transacción, SQL Server no confirma realmente las transacciones
interiores hasta que haya confirmado con éxito la transacción exterior; al mismo tiempo, SQL Server
libera todos los recursos empleados por las transacciones interiores y por la exterior. Si la
transacción exterior no logra confirmar, ninguna de las transacciones interiores se confirma, y se
deshacen tanto la transacción exterior como las interiores. Si la transacción exterior se confirma, se
confirman todas las transacciones interiores. En otros términos, SQL Server básicamente ignora
todas las instrucciones COMMIT de las transacciones anidadas interiores, en el sentido de que las
transacciones interiores no se confirman y, en vez de eso, espera a la confirmación o cancelación
final de la transacción exterior para determinar el estado de terminación de todas las transacciones
interiores.

Además, en las transacciones anidadas, si se ejecuta una instrucción ROLLBACK en el


interior de la transacción exterior o de alguna de las transacciones interiores, se deshacen todas las
transacciones.

Modo de transacciones implícitas

En el modo de transacciones implícitas las transacciones comienzan automáticamente


siempre que se emplean determinadas instrucciones de T-SQL y continúan hasta que se concluyen
de manera explícita con una instrucción COMMIT o ROLLBACK. Si no se especifica una
instrucción de conclusión, la transacción se deshará cuando el usuario desconecte. Las siguientes
instrucciones comienzan transacciones nuevas en el modo de transacciones implícitas:

· ALTER TABLE
· CREATE
· DELETE
· DROP
· FETCH
· GRANT
· INSERT
· OPEN
· REVOKE
· SELECT
· TRUNCATE TABLE
· UPDATE

Cuando se emplea una de estas instrucciones para comenzar una transacción implícita, la
transacción continúa hasta que se concluye de manera explícita, aunque se ejecute otra de estas
instrucciones en el interior de la transacción. Una vez confirmada o cancelada de manera explícita
cita la transacción, se comienza una nueva transacción en la siguiente en que se emplea de estas
instrucciones. Este proceso continúa hasta que se desactiva el modo de implícitas.

Para dejar el modo de transacciones implícitas de transacciones en ON, se puede emplear el


siguiente comando de T-SQL:

41 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

Las transacciones implícitas resultan útiles cuando se ejecutan secuencias de comandos que
llevan a cabo modificaciones de los datos que hay que proteger dentro de la transacción. El modo de
transacciones implícitas se puede activar al comienzo de la secuencia de comandos, llevar a cabo las
modificaciones necesarias y luego desactivar el modo al final de la secuencia. Para evitar problemas
de concurrencia conviene desactivar el modo de transacciones implícitas después de finalizar las
modificaciones de los datos y antes de explorarlos. Si la instrucción que sigue a una confirmación es
una instrucción SELECT, comenzará una nueva transacción en modo de transacciones implícitas, y
los recursos no se liberarán hasta que se confirme esa transacción.

Puntos de almacenamiento

Se puede evitar tener que deshacer toda la transacción empleando un punto de


almacenamiento para deshacer hasta cierto punto de la transacción, en lugar de llegar hasta el
comienzo de la transacción.

Todas las modificaciones producidas hasta el punto de almacenamiento siguen siendo válidas
y no se deshacen, pero las instrucciones ejecutadas después del punto de almacenamiento (que debe
especificarse en la transacción) y hasta la instrucción ROLLBACK se deshacen. Las instrucciones
situadas a continuación de la instrucción ROLLBACK seguirán ejecutándose. Si se deshace
posteriormente la transacción sin especificar un punto de almacenamiento, todas las modificaciones
se anulan hasta el principio de la transacción, como siempre; se deshace toda la transacción. Hay
que tener en cuenta que cuando se deshace una transacción hasta un punto de almacenamiento,
SQL Server no libera los recursos bloqueados. Se liberan cuando se confirma la transacción o al
producirse una cancelación de toda la transacción.

Para especificar un punto de almacenamiento en una transacción se utiliza la instrucción


siguiente:

SAVE TRAN[SACTION] {nombre_de_punto_de_almacenamiento |


@variable_nombre_de_punto_de_almacenarniento}

Se añade de un punto de almacenamiento en la transacción en la posición hasta la que se


desea deshacer. Para deshacer hasta el punto de almacenamiento hay que utilizar ROLLBACK
TRAN con el nombre del punto de almacenamiento, como se muestra a continuación:

ROLLBACK TRAN nombre_del_punto_de_almacenamiento

Se pueden tener más instrucciones de T-SQL después de la instrucción ROLLBACK para


continuar la transacción. Hay que recordar incluir una instrucción COMMIT u otra instrucción
ROLLBACK después de la primera instrucción ROLLBACK para que se complete toda la
transacción.

BLOQUEO DE TRANSACCIONES
SQL Server utiliza un objeto denominado bloqueo para evitar que varios usuarios realicen

42 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

adquieren por la conexión de usuario. Cuando un usuario adquiere (o posee) un bloqueo sobre un
recurso ese bloqueo indica que el usuario tiene derecho a utilizar ese recurso. Entre los recursos que
se pueden bloquear por los usuarios están las filas de datos, las páginas de datos, las extensiones
(ocho páginas), las tablas y toda la base de datos en su conjunto. Por ejemplo, si un usuario tiene un
bloqueo sobre una página de datos, los demás usuarios no pueden realizar ninguna operación en esa
página que puedan afectar a las que realice el usuario que posee el bloqueo. Por tanto, un usuario no
podrá actualizar ninguna página de datos que se halle bloqueada por otro usuario que la esté
recuperando. Tampoco puede adquirir un bloqueo que pueda entrar en conflicto con otro bloqueo ya
establecido por otro usuario. Por ejemplo, dos usuarios no pueden tener al mismo tiempo bloqueos
para actualizar la misma página. El mismo bloqueo no puede emplearlo más de un usuario.

La gestión de bloqueos de SQL Server adquiere y libera los bloqueos de manera automática
de acuerdo con las acciones de los usuarios. No hace falta que el administrador de la base de datos
ni el programador realicen ninguna acción. No obstante, se pueden utilizar sugerencias de
programación para indicar a SQL Server el tipo de bloqueo que se va a adquirir al realizar una
consulta modificación de la base de datos.

En este apartado se examinarán los niveles de granularidad de los bloqueos y los modos de
bloqueo. Pero, en primer lugar, se examinarán algunas de las características de gestión de' mejoran
el rendimiento de SQL Server.

Niveles de bloqueo

Los bloqueos pueden adquirirse sobre varios recursos diferentes; el tipo de recurso determina
el nivel de granularidad del bloqueo. La siguiente tabla muestra los recursos que puede bloquear
ver, ordenados desde el nivel más fino de granularidad de bloqueo hasta el más basto.

Recursos bloqueables

Recurso Tipo de bloqueo Descripción

Identificador de fila Nivel de fila Bloquea una sola fila de una tabla

Clave Nivel de fila Bloquea una sola fila de un índice

Página Nivel de página Bloquea una página de 8-KB de una tabla o de un índice

Extensión Nivel de extensión Bloquea una extensión, un grupo de ocho páginas contiguas de
datos o de índices

Tabla Nivel de tabla Bloquea toda una tabla

Base de datos Nivel de base de datos Bloquea toda una base de datos

43 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

ejemplo la concurrencia aumenta porque se permite a más usuarios tener acceso a varias páginas o a
varias filas de una tabla de manera simultánea. En este caso también se incrementa la sobrecarga, ya
que se necesitan más bloqueos cuando se tiene acceso por separado a muchas filas o a muchas
páginas.

SQL Server selecciona de manera automática el tipo de bloqueo apropiado para la tarea en
cuestión, al tiempo que minimiza la sobrecarga de bloqueos. SQL Server también determina de
manera automática el modo de bloqueo de cada transacción que implica a un recurso bloqueado;
estos modos se tratarán a continuación.

Modos de bloqueo

Los modos de bloqueo especifican el modo en que usuarios concurrentes (o transacciones


concurrentes) pueden tener acceso a los recursos. Cada tipo de recursos se puede adquirir en alguno
de estos modos.

Se dispone de seis modos de bloqueo: compartido, actualización, exclusivo, tentativo,


esquema y actualización masiva.

Compartido

El modo de bloqueo compartido se utiliza para operaciones sólo de lectura como las que se
llevan a cabo utilizando la instrucción SELECT. Este modo permite que las transacciones
concurrentes lean el mismo recurso de manera simultánea, pero no le permite modificarlo a ninguna
de ellas. Los bloqueos compartidos se liberan en cuando la lectura ha concluido a menos que se
haya definido el nivel de aislamiento como lectura repetible o superior, o si se ha especificado en la
transacción una sugerencia de bloqueo que anula este comportamiento.

Actualización

El modo de bloqueo de actualización se utiliza cuando cabe la posibilidad de que se ejecute


una actualización del recurso.

Sólo una transacción puede obtener un bloqueo de actualización en un momento dado. Si la


transacción realiza una modificación (porque, por ejemplo, la condición de búsqueda ha hallado filas
que modificar), el bloqueo de actualización se transforma en bloqueo exclusivo (que se describe a
continuación); en caso contrario, se transforma en bloqueo compartido.

Exclusivo

El modo de bloqueo exclusivo se utiliza para operaciones que modifican los datos, como las
actualizaciones, las inserciones y las eliminaciones. Cuando una transacción establece un bloqueo

44 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

De intención

El modo de bloqueo de intención se emplea para establecer una jerarquía de bloqueos. Por
ejemplo un bloqueo de intención en el nivel de las tablas indica que SQL Server pretende adquirir
bloqueo sobre una o varias páginas o filas de esa tabla. Generalmente, si una transacción adquirir un
bloqueo exclusivo sobre un recurso, SQL Server comprueba en primer lugar algún bloqueo de
intención sobre el mismo. Si una transacción ha establecido un bloqueo de intención que está
esperando ese recurso, la segunda transacción no puede adquirir el bloqueo exclusivo. Si no hay
ninguna transacción que mantenga un bloqueo de intención y esté esperan recurso, la transacción
puede adquirir el bloqueo exclusivo sobre él. Hay tres tipos de bloqueo de intención que son los
siguientes:

· Compartido de intención: Indica que una transacción pretende establecer un bloqueo


compartido sobre el recurso.

· Exclusivo de intención: Indica que una transacción pretende establecer un bloqueo exclusivo
sobre el recurso.

· Compartido de intención exclusivo: Indica que una transacción pretende establecer un


bloqueo compartido sobre algunos recursos y un bloqueo exclusivo sobre otros.

Esquema

El modo de bloqueo de esquema se utiliza cuando se ejecuta una operación de cambio del
esquema de una tabla, como la adición de una columna a una tabla, o cuando se compila una
consulta. Hay dos tipos de bloqueo de esquema para estos casos: modificación de esquema (Schema
Modification, Sch-M) y estabilidad de esquema (Schema Stability, Sch-S). Se emplea un bloqueo de
modificación de esquema cuando se lleva a cabo alguna operación de tabla del lenguaje de
definición de datos (Data Definition Language, DDL). Los bloqueos de estabilidad de esquema se
emplean para compilar las consultas. Cuando se compila una consulta las demás transacciones
pueden ejecutar y adquirir simultáneamente bloqueos sobre la tabla, incluso bloqueos exclusivos,
pero no se pueden ejecutar instrucciones DDL sobre la tabla cuando hay un bloqueo de estabilidad
del esquema.

Actualización masiva

El modo de bloqueo de actualización masiva se utiliza cuando se copian masivamente datos a


una tabla con la sugerencia TABLOCK especificada o cuando se define la opción table lock on bulk
load empleando sp_tableoption. El objetivo del bloqueo de actualización masiva es permitir los
procesos que copian datos masivamente en la misma tabla de manera concurrente mientras se evita
el acceso a esa tabla de los procesos que no llevan a cabo una copia masiva.

BLOQUEOS E INTERLOQUEOS

45 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

trate de la mejor manera posible; aquí sólo se describirán para que se tenga noticia de su existencia y
para que se comprendan los conceptos correspondientes. Evitar y resolver los problemas de
bloqueos y de interbloqueos es responsabilidad del programador.

Los bloqueos tienen lugar cuando una transacción mantiene un bloqueo sobre un recurso y
otra transacción solicita un tipo de bloqueo sobre ese recurso que entra en conflicto con el existente.
La segunda transacción debe esperar a que la primera libere su bloqueo - en otros términos, queda
atascada o bloqueada por la primera transacción. Los bloqueos suelen producirse cuando una
transacción mantiene un bloqueo durante mucho tiempo, lo que genera una cadena de transacciones
atascadas que esperan que concluyan otras transacciones para poder obtener los bloqueos
solicitados - una situación denominada bloqueo en cadena. La siguiente figura muestra un ejemplo
de bloqueo en cadena.

Los interbloqueos se diferencian de las transacciones bloqueadas en que implican a dos


transacciones bloqueadas que se esperan la una a la otra. Por ejemplo, supóngase que una
transacción mantiene un bloqueo exclusivo sobre Tabla 1 y otra mantiene un bloqueo exclusivo
sobre Tabla 2. Antes de que se libere cada uno de los bloqueos exclusivos la primera transacción
solicita un bloqueo sobre Tabla 2 y la primera transacción solicita un bloqueo sobre Tabla 1. Desde
ese momento cada transacción espera a que la otra libere su bloqueo exclusivo, pero ninguna lo va a
liberar hasta que no se produzca una confirmación o cancelación que complete la transacción. No se
puede completar ninguna de las transacciones porque para continuar solicitan un bloqueo que
mantiene la otra transacción: ¡interbloqueo! La figura siguiente ilustra esta situación. Cuando se
produce un interbloqueo bloqueo SQL Server termina una de las transacciones, que habrá que
volver a ejecutar.

46 de 47 24/05/2011 11:50 p.m.


ADMINISTRACIÓN AVANZADA DE MS SQL SERVER 2000 http://usuarios.multimania.es/cursosgbd/UD7.htm

47 de 47 24/05/2011 11:50 p.m.

Vous aimerez peut-être aussi